我创建了一个 .dll(具有 MFC 静态链接和静态链接的 Windows 运行时库),我正在链接到一个使用 boost 进行内存管理的库(该库是 PCL)。一切都编译正常,没有错误,但我注意到在库代码内部,内存分配工作不正常。例如,下面一行
indices_.reset (new std::vector<int>);
try {
indices_->resize (input_->points.size ());
}
分配一个新的 std::vector,不抛出任何异常,但是在 resize 函数之后 vector 仍然是空的。为什么会这样?
如果我自己在自己的 DLL 代码中分配 vector ,则分配工作正常。但是会出现其他错误,例如突然消失的字符串(当我将鼠标悬停在这些字符串上时,Visual Studio 调试器显示“读取内存错误”)。
我使用库到 DLL 的静态链接(我使用的是静态运行时库/MT)。
会发生什么?
最佳答案
静态运行时库是问题所在。
您只能将内存与相同的运行时库进行互操作。如果你是静态链接,那么 DLL 和 EXE 有它们自己不同的拷贝——如果你试图在它们之间传递复杂类型,这是非常糟糕的。
如果您想共享像 std::vector 这样的复杂对象,您需要动态链接两侧的运行时以获得一份 CRT。
我相信 MFC 和 CRT 有同样的问题——你需要共享一个拷贝,而不是每个人都有一个拷贝。
关于c++ - boost shared_ptr 和内存分配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29846693/