zoukankan      html  css  js  c++  java
  • 严防程序模块间通过结构体间接传递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实例对象中的元素,地雷爆发,程序奔溃!



  • 相关阅读:
    十四、内部类
    十三、模板设计模式
    十二、面向对象之多态
    三、泛型
    Spring Security学习笔记
    Maven构建web项目在Eclipse中部署的几种方法
    spring如何实现定时任务
    安装jar包到本地仓库
    使用java对pdf转成tiff文件
    word文档转pdf解决修订问题
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2416023.html
Copyright © 2011-2022 走看看