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



  • 相关阅读:
    调度器2—cat /proc/<pid>/sched内容分析
    调度器1—相关接口和命令行工具
    Java中的String类
    Java中的数组
    代码访问使用Let's Encrypt证书的网站提示certificate has expired的解决方法
    Linux环境Clion使用Protobuf
    PyTorch Dataloader读取时如何在进程之间传输数据
    6 安装Grafana 展示promethues数据
    5 Prometheus relabel配置
    4 PromQL
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2416023.html
Copyright © 2011-2022 走看看