使用DLL代码时堆积损坏

时间:2011-10-07 13:31:27

标签: c++ debugging dll heap corruption

我需要将一些代码放在一个公共库dll中。这个代码是一个类CalibrationFileData,当它作为当前项目的一部分构建时,它可以正常工作。但是,如果在公共库中构建CalibrationFileData,则程序崩溃,提及堆损坏。

我确保所有分配和解除分配都在类中发生,具有适当的访问器等。但问题不会消失。为了防止它产生任何影响,我有时会传递对的向量,绝对不是普通的旧数据,但向量操作只能通过访问器进行,因此不应该在模块之间进行任何分配。

我缺少什么?

编辑:这些向量是:

std::vector<std::pair<CvPoint2D32f, CvPoint3D32f>>* extrinsicCorrespondences;
std::vector<int>* pointsPerImage;

我不需要担心深拷贝,因为它们不是堆分配的,对吧?顺便说一下,我尝试将指针用于矢量,如上所述,以回避问题,但无论如何它都没有任何区别。

7 个答案:

答案 0 :(得分:4)

检查库和可执行文件之间的编译标志匹配。例如,在Windows上确保您使用相同的C运行时库(CRT)(/ MD vs / MT)。检查链接器的警告。

答案 1 :(得分:1)

您确定当您对方法中的vector个对象的内容拥有所有权时,您是否正在将它们深入复制到实例变量中?

答案 2 :(得分:0)

你应该检查矢量对象内的深层副本,它与深度复制有关,我认为

答案 3 :(得分:0)

可能是两个项目中为_SECURE_SCL定义的不同值吗?

答案 4 :(得分:0)

您可能错过了一些客户端代码尝试释放DLL分配的内存,反之亦然。

也许最简单的方法是确保客户端和DLL都使用相同的内存分配器。不仅是同一种类,而是分配器的相同实际“实例”。在Visual C ++上,使用“多线程调试DLL(/ MDd)”或“多线程DLL(/ MD)”运行时库, 客户端和DLL最容易实现。

答案 5 :(得分:0)

在命令行选项中,在visual studio中删除此_SECURE_SCL。大多数情况下,此崩溃是由_SECURE_SCL细节之间的不匹配引起的。更多细节可以在这里找到:http://kmdarshan.com/blog/?p=3830

答案 6 :(得分:0)

您应该区分紧密耦合的松散耦合的 DLL

紧密耦合 DLL意味着

  

DLL使用完全相同的编译器版本构建,打包和   调用约定设置,库选项作为应用程序,以及   两者都动态链接到运行时库(/MD编译器选项)。   这允许您来回传递对象,包括STL个容器,   从应用程序内部分配DLL个对象,派生自base   在其他模块中的课程,尽你所能   不使用DLL。缺点是你不能再   独立于主应用程序部署DLL。两者都必须   一起建造。 DLL只是为了改善您的流程启动时间   和工作集,因为应用程序可以开始运行   加载DLL(使用/delayload链接器选项)。建立时间   也比单个模块更快,特别是在整个程序时   使用优化。但优化不会在整个过程中发生   application-DLL boundary。任何非平凡的变化仍将存在   需要重建两者。

如果松散耦合 DLL,则

  

导出DLL函数时,如果它们只接受整数,则效果最佳   数据类型,即int或指针。

例如,参考字符串,然后:

  

当您需要传递字符串时,请将其作为const char *传递。当你   需要DLL函数返回一个字符串,传递给DLL char *   指向预分配缓冲区的指针,DLL将写入   字符串。

最后,关于内存分配,那么:

  

切勿使用DLL以外的DLL分配的内存   函数,永远不会传递有自己的值结构   构造/析构。

<强>参考

Heap corruption when returning from function inside a dll

Can I pass std::string to a DLL?