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