关于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修饰符已保证堆内存的申请和释放是一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值