Boost shared_ptr和内存分配不起作用

时间:2015-04-24 11:45:52

标签: c++ memory-management boost mfc

我创建了一个.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)。

可能会发生什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

我认为MFC与CRT有同样的问题 - 您需要共享一份副本,而不是每份都有副本。

答案 1 :(得分:0)

  

问。为什么会这样?

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

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