关于DLL new exe delete问题

如果DLL和EXE都是用MD选项编译。也就是说内存的申请和释放全部都用的MSVCRT.dll和MSVCRP.DLL(前者用于new和delete等内存管理,后者用于stl实现的内存管理)。这样的情况下是不会有问题的。因为内存的申请和销毁都是用的同一个堆。

如果DLL和EXE不是都用的MD(任意一个用了MT)。所谓MT,就是多线程静态链接,这个时候,将不再依赖VC的运行时库(CRT)。那么DLL和EXE分别有自己的堆,查看CRT的源码你可以看到,所有的内存的申请和释放都是用的HeapAlloc和HeapFree来实现的。它们的第一个参数就是堆句柄。这样子你在DLL中申请的内存传入的句柄是DLL的堆句柄,但是在EXE中调用的时候删除对象释放内存时,传入的句柄是EXE的堆句柄,自然就会出现堆破坏的情况。

有两种解决方案用于导出类:
1.使用MD选项进行EXE和DLL的编译。如果你讨厌manifest,你可以修改CRT的代码,重新编译不依赖manifest的crt。

2.可以使用MT。但是导出类的成员变量永远不要在EXE中直接赋值。而是应该在导出类中的为每个成员变量创建单独的函数来进行赋值操作。另外函数中所有的非基本类型(例如string)的参数全部都要const修饰符已保证堆内存的申请和释放是一致的。

你可能感兴趣的:(关于DLL new exe delete问题)