【问题标题】:Boost shared_ptr and memory allocation not working提升 shared_ptr 和内存分配不起作用
【发布时间】:2015-04-24 11:45:52
【问题描述】:

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

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

分配一个新的std::vector,不抛出任何异常,但是在resize函数之后vector还是空的。为什么会这样?

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

我使用库的静态链接到 DLL(并且我正在使用静态运行时库,/MT)。

会发生什么?

【问题讨论】:

    标签: c++ memory-management boost mfc


    【解决方案1】:

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

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

    如果您想共享 std::vector 等复杂对象,则需要动态链接两侧的运行时以获得一份 CRT。

    我相信 MFC 和 CRT 有同样的问题——你需要共享一个副本,而不是每个副本。

    【讨论】:

    • 这确实是我的怀疑。但是,OP 并没有说他们静态链接到的库也静态链接到 CRT。我不知道我们是否可以做出这样的假设(坦率地说,我认为 msvcrt 已经好几年都不允许静态链接了)
    • 但我还有一个问题。我可以动态使用 CRT 但仍静态链接我的库吗?
    【解决方案2】:

    问。为什么会这样?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多