我需要将一些代码放在一个公共库dll中。这个代码是一个类CalibrationFileData
,当它作为当前项目的一部分构建时,它可以正常工作。但是,如果在公共库中构建CalibrationFileData
,则程序崩溃,提及堆损坏。
我确保所有分配和解除分配都在类中发生,具有适当的访问器等。但问题不会消失。为了防止它产生任何影响,我有时会传递对的向量,绝对不是普通的旧数据,但向量操作只能通过访问器进行,因此不应该在模块之间进行任何分配。
我缺少什么?
编辑:这些向量是:
std::vector<std::pair<CvPoint2D32f, CvPoint3D32f>>* extrinsicCorrespondences;
std::vector<int>* pointsPerImage;
我不需要担心深拷贝,因为它们不是堆分配的,对吧?顺便说一下,我尝试将指针用于矢量,如上所述,以回避问题,但无论如何它都没有任何区别。
答案 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
函数返回一个字符串,传递给DLLchar *
指向预分配缓冲区的指针,DLL
将写入 字符串。
最后,关于内存分配,那么:
切勿使用
DLL
以外的DLL
分配的内存 函数,永远不会传递有自己的值结构 构造/析构。
<强>参考强>