提升shared_ptr和内存分配不起作用
Boost shared_ptr and memory allocation not working
我创建了一个.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 违规时)
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配