Symbian^3对标准C++的支持

声明:原文来至 Standard C++ Support on the Symbian Platform,水平有限,敬请谅解。
http://library.forum.nokia.com/index.jsp?topic=/Nokia_Symbian3_Developers_Library/GUID-2CCD1748-9EDE-5383-9941-A3051E06F3E2.html

(注:S60平台增强了对标准c++的支持,开发者可以把代码编译成标准C++类型的库,STDEXE、STDDLL、STDLIB)
本节讲述Symbian^3对标准C++运行时特性的支持
提纲:
全局操作符new (global operator new)
new_handler
全局对象的析构 (global objects destruction)
STL

全局操作符new (global operator new)

在标准C++中,new分配内存失败时,如果设置的处理错误的handler,则调用这个handler,如果没有设置handler,则抛出exception (std::bad_alloc)。但是在symbian C++中,动态分配内存失败返回NULL指针。
所以当你编写C++代码时,必须清楚当前使用标准C++还是Symbian C++。
你可以使用下列办法,在Symbian平台上使用标准C++。
1> 编译成STD类型的应用程序或库
2> 在MMP文件中使用STDCPP关键字
注意,使用全局操作符new带来的问题参见"new操作符的使用"。
警告,symbian平台不允许你混合使用全局操作符new和symbian C++操作符new。

下面的例子演示了如何在MMP文件中使用STDCPP关键字来使用标准C++的操作符new,而不用把工程编译成STD类型。

//operator_new_example.mmp
Target operator_new_example.exe
Targettype exe
//The STDCPP keyword specifies Standard C++
STDCPP
Source operator_new.cpp
Systeminclude /epoc32/include/stdapis/stlportv5
Systeminclude /epoc32/include/stdapis
Library libstdcppv5.lib libc.lib
Capability all -tcb

//operator_new.cpp
#include <new>
int main()
{
try
{
int *ptr = new int(0);
//do something
}
catch(std::bad_alloc)
{
return 1;
}
delete ptr;
return 0;
}

new_handler

标准C++使用new分配内存失败时,如果设置了new_handler,则会使用这个new_handler处理这个错误。现在Symbian C++也支持这个特性。

下面的例子演示了如何在Symbian平台上使用这个特性。(别忘了MMP中使用STDCPP关键字或者使用STDEXE/STDDLL编译类型)

#include <new>
int one_huge_chunk = 0xa000;
int *last_huge_chunk=NULL;
void foo()
{
/*
* new_handler释放最后一次成功分配的内存,来保证下一次分配成功。
*/
delete [] last_huge_chunk;
}
void bar()
{
last_huge_chunk = new int[one_huge_chunk];
}
int main()
{
std::new_handler h_new;
try
{
while(1)
{
// 不停地分配内存,直到系统内存耗尽,不能再分配出内存。
bar();
}
}
catch(std::bad_alloc ba)
{
/*
* 没有设置new_hanlder时,分配失败会得到一个std::bad_alloc类型的exception,
* 下面设置new_handler。
*/
h_new = (std::new_handler)&foo;
try
{
/*
* 测试new_handler释放一次内存后,还能否再分配出内存。
*/
bar();
}
catch(...)
{
}
return 0;
}
/*没有收到std::bad_alloc错误*/
return 1;
}

全局对象的析构 (global objects destruction)

动态或静态加载的DLL现在都支持全局对象了,它们的析构函数也会被调用,当该DLL的引用数(reference count)为0时。

举例:

// glob_data.cpp
#include <iostream>
// class definition
class AClass
{
AClass()
{
std::cout << “ctor()” << std::endl; // inline constructor
}
~AClass()
{
std::cout << “dtor()” <<std::endl; // inline destructor
}
};
AClass GlobData; // 全局对象
int main()
{
std::cout << “main()” << std::endl;
}

输出结果

ctor
main
dtor

(题外话,偶就是碰到这个狗血问题才阅读这篇文档。S60的3rd和5th版本不支持全局对象的析构,特别是这里可能引发内存泄漏(PANIC ALLOC),所幸Symbian^3非常不完美地增加了这一支持。)
(虽然例子代码能释放全局对象,但偶在某处全局对象却始终无法调用析构函数,不过这个问题在其它代码不能重现,原因还没找到,同样的代码Android NDK和WM却都能,所以说它非常不完美。全局对象最好还是要手动释放。)

STL

增加了标准模板库的一些新特性。
基于STLPort v5.1.4
头文件位于${EPOCROOT}/epoc32/include/stdapis/stlportv5
必须使用库libstdcppv5.lib

Symbian^3对标准C++的支持相关推荐

  1. python标准库很丰富支持多种编程范式_基础班-第03天{python基础}

    声明:内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归传智播客官方所有. 认识python(了解) 1.Python发展历史 起源 Python的作者,Guido von Rossum,荷兰 ...

  2. cryptojs aes加密每次结果不同_Javascript加密算法标准库,支持Nodejs+浏览器——crypto-js...

    介绍 crypto-js是一个前端Javascript标准加密算法库,CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法.有时候项目涉及到的敏感数据比较多,为 ...

  3. python标准库很丰富支持多种编程范式_计算机考试简答题

    1 .简述 python 的特点: Python 具有简单易学,免费.开源,可扩展性.可嵌人性和可移植性强,代码规范.代 码具有较好可读性, Python 标准库很丰富,支持命令式编程.面向对象程序设 ...

  4. 基于c++11新标准开发一个支持多线程高并发的网络库

    背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...

  5. 注意升级Oracle 19c:SE2标准版不再支持RAC

    摘要:从Oracle 19c版开始,在标准第二版(SE2)中将不再支持Oracle RAC高可用功能,客户可以选择保留18C,而不会影响其当前的RAC配置.标准版从19C后限制更加苛刻. 点击原文链接 ...

  6. 【出题神器】口算大师全能标准版,支持自定义输出

    介绍: 今天推荐一款驯兽神器<口算大师全能标准版> 软件免费.全能.无限制,作者支持无限分享. 网盘下载地址: https://zijiewangpan.com/rOA1iLK3fga 图 ...

  7. 完成OSS.Http底层HttpClient重构封装 支持标准库

    OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力.由于OSS.Http类库是几年前我参照RestSharp的思路,完 ...

  8. PS3支持的显示标准介绍

    PS3的视频输出分别有: ① HDMI 1.3版本 02年推出HDMI 1.0版本以来,HDMI规范已经升级数次:2004年5月HDMI升级到HDMI 1.1版本 ,接着为了更好的兼容PC系统,HDM ...

  9. 北京昌平区高新技术企业培育支持标准,补贴10万

    根据往年的各企业申报经验,北京昌平区高新技术企业培育支持标准,这为高新技术企业的发展提供了难得机遇,也提出了新的更高要求.以市场为导向.产学研联合,在规范的核算.激励.人财物保障的情况入不断投入研发费 ...

最新文章

  1. java接口返回值_java后台调用接口并返回值
  2. 1、cocos2d-x环境安装
  3. REST、RESTful 与 RESTful API
  4. AWS Elemental推出新一代基于云的直播视频服务
  5. 云服务器有什么好 能让云大佬们竞争如此激烈
  6. ReviewForJob(1)数据结构与算法分析引论
  7. 实时内核(Core)和实时操作系统(RTOS)有何不同?
  8. iOS开发之CALayer
  9. 以人为尊真我生活,Leave the world behind
  10. 阶段3 1.Mybatis_09.Mybatis的多表操作_2 完成account表的建立及实现单表查询
  11. [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
  12. 计算机组成原理秦磊华 pdf,_计算机组成原理_设计性实践教学模式研究_秦磊华.pdf...
  13. 简历空白怎么办?计算机专业应届生和在校生怎么写简历?
  14. js 实现大小写转换的方法
  15. 西安电子科技大学-概率论与数理统计大作业-概率论与数理统计在日常生活和社会经济中的应用
  16. python定义一个字符串变量_python基础入门语法和变量类型(一)
  17. 44学习自动化运维工具 Chef 的基本用法,包括厨师编写、节点管理
  18. 在Windows Server 2022系统上安装 Brother MFC-7450打印机驱动
  19. c语言程序设计账单,C语言课程设计——账单管理
  20. TIA博途中进行积分运算的具体方法

热门文章

  1. 软件测试从业 3 年+了,怎么兼顾 管理 与 自身成长?
  2. java贝叶斯分类器 开源_贝叶斯分类器
  3. 剑指offer面试题[7]-用两个栈实现队列
  4. git生成SSH密钥提示ssh文件不存在-已解决
  5. PAT甲级1022 map、set的使用
  6. 计算机的发展经历了选择题,计算机发展历程的相关选择题.doc
  7. mysql 事务 不同库_MYSQL数据库重点:事务与锁机制
  8. jdk 安装cmd运行java_windows下安装jdk,cmd下编译运行java程序一点心得
  9. php mysql cpu100_mysql进程占服务器cpu100%的解决方法
  10. hl3150cdn打印不了照片_如何在美国打印证件照片 (Passport Photos)?