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实例对象中的元素,地雷爆发,程序奔溃!



  • 相关阅读:
    [YTU]_2436( C++ 习题 输出日期时间--友元类)
    [YTU]_2435 ( C++ 习题 输出日期时间--友元函数)
    病毒侵袭
    石子合并(区间DP经典例题)
    AC自动机模板2
    【模板】最近公共祖先(LCA)
    华华给月月出题
    线性筛素数
    华华开始学信息学
    华华和月月种树
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2416023.html
Copyright © 2011-2022 走看看