提升shared_ptr和内存分配不起作用

Boost shared_ptr and memory allocation not working

本文关键字:内存 分配 不起作用 ptr shared 提升      更新时间:2023-10-16

我创建了一个.dll(MFC静态链接和Windows运行时库也静态链接),我正在链接到一个使用boost进行内存管理的库(该库是PCL)。一切编译正常,没有错误,但我注意到在库代码中,内存分配无法正常工作。对于意图,以下行

indices_.reset (new std::vector<int>);
try    {      
  indices_->resize (input_->points.size ());    
}

分配一个新的 std::vector,不会引发任何异常,但在调整大小函数后向量仍然是空的。为什么会这样?

如果我自己在自己的 DLL 代码中分配向量,则分配工作正常。但会出现其他错误,例如字符串突然消失(当我将鼠标悬停在这些字符串上时,Visual Studio 调试器显示"读取内存时出错")。

我使用库到 DLL 的静态链接(我使用的是静态运行时库/MT)。

可能会发生什么?

静态运行时库是问题所在。

只能将内存与同一运行时库进行互操作。如果你是静态链接,那么DLL和EXE有自己不同的副本 - 如果你试图在它们之间传递复杂类型,这是非常糟糕的。

如果要

共享像 std::vector 这样的复杂对象,则需要动态链接两端的运行时以获取 CRT 的一个副本。

我相信 MFC 与 CRT 有相同的问题 - 您需要共享一个副本,而不是每个副本都有一个副本。

问:为什么会这样?

最明显的解释是points.size ()返回 0。

否则,将涉及 UB(例如在链接库的冲突版本或 ODR 违规时)