【发布时间】:2020-10-22 02:36:24
【问题描述】:
我看到文章指出在 dll 之间传递 STL 和 shared_ptr 是不安全的,因为
- 这可能会导致内存损坏和
- 它们可能具有不同的 C++ 运行时实现,因此会导致未定义的行为。
问题 1:如果我使用相同的编译器版本和标志编译两个库,这是真的吗?考虑到 C++ 运行时相同,并且 dll 通常从调用进程的虚拟地址空间分配内存,这两点仍然有效。
问题 2:我看到解决方案涉及在堆上的一个 dll 中创建对象并传递一个自定义析构函数,该析构函数在创建 smart_ptr 时对其进行清理并将其传递,以便可以从创建它的第二个第一个 dll 中安全地删除它当参考丢失时。什么时候有这个需求?这不是 ABI 稳定的吗?这不是只需要 dll 在它自己的地址空间中创建对象并且您不希望另一个 dll 从中删除吗?这不是默认的吧?
问题 3:这是否同样与静态库相关,彼此交谈说使用不同的编译器版本构建。
【问题讨论】:
标签: c++ dll shared-libraries shared-ptr abi