严防程序模块间通过结构体间接传递STL实例对象
2012-03-24 21:48
295 查看
严防程序模块间通过结构体间接传递STL实例对象
经常的,我们通过结构体向函数传递参数。原则上,不应在结构体中包含非POD成员。
[引用]
===========================================================================
POD, plain old data 的缩写,一个普通的古老的数据结构(POD)是一种数据结构。它仅作为被动的收藏的字段值,不使用封包或者otherobject-oriented特征。(A plain old data structure(POD) is a data structurethat is represented only as passive collections of field values, without using encapsulationor otherobject-orientedfeatures.)
===========================================================================
相关问题请看下面这个帖子:
《结构体定义中不要包含非内建类型的成员》
http://www.pc.nd/index.php?doc-view-10894(公司内网,访问不了,请见谅)
可惜的,我们经常在结构体中包含非POD成员。当然,除去上面帖中提到的问题外(关于 memset(&info, 0, sizeof(info)); 引发的问题),似乎没有什么好担心的,就算包含了STL实例对象也如此。确实,在同一个程序模块中,只要稍加注意便可避免这类问题。
但是,这种行为放在多模块间数据传递的情况下则危机重重。
首先,在模块间传递STL实例对象是一件很危险的事情,由此引发的崩溃不好排查,相关问题请看下面2个帖子:
《DLL导入导出STL类对象导致崩溃的问题》
http://www.pc.nd/index.php?doc-view-12643 (公司内网,访问不了,请见谅)
《跨dll 使用stl 异常问题》
http://www.pc.nd/index.php?doc-view-12743 (公司内网,访问不了,请见谅)
进而,通过结构体间接地将STL实例对象传递给其他模块中的函数,则将其危险隐蔽起来,成为一个很难发现的陷阱。例如结构体直接包含STL实例对象成员,更甚者结构体包含一个自定义类型对象,而这个对象才直接或间接包含了STL实例对象成员。
当在其他模块访问这个STL实例对象中的元素,地雷爆发,程序奔溃!
经常的,我们通过结构体向函数传递参数。原则上,不应在结构体中包含非POD成员。
[引用]
===========================================================================
POD, plain old data 的缩写,一个普通的古老的数据结构(POD)是一种数据结构。它仅作为被动的收藏的字段值,不使用封包或者otherobject-oriented特征。(A plain old data structure(POD) is a data structurethat is represented only as passive collections of field values, without using encapsulationor otherobject-orientedfeatures.)
===========================================================================
相关问题请看下面这个帖子:
《结构体定义中不要包含非内建类型的成员》
http://www.pc.nd/index.php?doc-view-10894(公司内网,访问不了,请见谅)
可惜的,我们经常在结构体中包含非POD成员。当然,除去上面帖中提到的问题外(关于 memset(&info, 0, sizeof(info)); 引发的问题),似乎没有什么好担心的,就算包含了STL实例对象也如此。确实,在同一个程序模块中,只要稍加注意便可避免这类问题。
但是,这种行为放在多模块间数据传递的情况下则危机重重。
首先,在模块间传递STL实例对象是一件很危险的事情,由此引发的崩溃不好排查,相关问题请看下面2个帖子:
《DLL导入导出STL类对象导致崩溃的问题》
http://www.pc.nd/index.php?doc-view-12643 (公司内网,访问不了,请见谅)
《跨dll 使用stl 异常问题》
http://www.pc.nd/index.php?doc-view-12743 (公司内网,访问不了,请见谅)
进而,通过结构体间接地将STL实例对象传递给其他模块中的函数,则将其危险隐蔽起来,成为一个很难发现的陷阱。例如结构体直接包含STL实例对象成员,更甚者结构体包含一个自定义类型对象,而这个对象才直接或间接包含了STL实例对象成员。
当在其他模块访问这个STL实例对象中的元素,地雷爆发,程序奔溃!
相关文章推荐
- iOS开发-通过btn传递两个实例对象 firstObject和secondObject
- android手机通过串口蓝牙透传模块与AVR单片机通信实例。。。蓝牙服务程序案例
- 通过btn传递两个实例对象
- 通过给事件处理程序传递this参数,获取事件源对象的引用。单机提交按钮时在信息框中显示用户输入的字符。
- 多个DLL(exe)之间通过指针或者引用传递STL对象
- 微信小程序 页面跳转和数据传递实例详解
- 在Android中通过Intent使用Bundle传递对象的使用方法
- js方法名通过参数传递调用实例
- VB6: 通过窗口句柄得到窗口所在程序的名称和路径(实例)
- 使用命名对象防止运行一个程序的多个实例【转】
- 如何通过JNI传递对象执行回调
- activity与service通过serializable传递复杂对象
- 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
- 通过内核对象在服务程序和桌面程序之间通信的小问题
- Android中使用putExtra()传递对象实例
- 7-8 点赞(20 分) 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人
- 通过实例学习Java对象的构造过程
- SpringMVC通过@PathVariable注解传递对象
- Android通过putExtra()传递JavaBean对象,属性值为null问题的解决
- Android--通过Intent使用Bundle如何传递对象