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



posted @ 2012-03-24 21:48  Atypiape2  阅读(809)  评论(0编辑  收藏  举报