C++开发DLL中使用new和delete注意事项

news/2024/5/20 9:54:35 标签: DLL, new, delete, heap,

报错情况

1,在 DLL 中用 new 来创建宿主程序中的对象,然后把这个对象指针保存到宿主程序,当 DLL 被卸载后,凡是涉及到这个指针的调用都会报错,包括 delete 这个指针也会有错。

2,在DLLnew出一个对象,然后在不需要使用时进行delete,结果会报如下错误:

Windows has triggered a breakpoint in wsTest.exe.
This may be due to a corruption of the heap, which indicates a bug in wsTest.exe or any of the DLLs it has loaded.




分析原因

因为new/delete使用的是局部(当然这与编译器可能也有关,但至少M$的编译器应该是这样的),也就是说不同的DLL虽然共享一个地址空间,但完全可能会维护不同的局部分段),这与编译器的实现有关。有些编译器可以选择使用进程共享的局部,但性能会受影响。

如果是不同的局部,当你在DLLnew时,是在DLL中分配的;而当你在EXE中delete时,EXE会认为它是在EXE的局部中分配的,从而用EXE的信息去释放它,从而可能导致错误。具体情况与管理代码的实现有关。

解决办法
1、为class或struct提供一个虚的create/free方法,在里面调用new/delete。不管是从EXE中分配的还是从DLL中分配的,都可以安全地用create方法创建/free方法释放,因为create/free是虚的,它的代码会和分配它的代码编译在同一个可执行体中。

2、用globalalloc()和globalfree()代替newdelete

3、用动态库版本的c run-time library可以解决这个问题。
在project->setting->c/c++->category中选code generation,然后在use run-time library中选debug multithreaded。

4、重载new/delete操作符。


http://www.niftyadmin.cn/n/1313427.html

相关文章

bzoj 3214: [Zjoi2013]丽洁体

Description 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子。这种往往被称为仿 写的题,不单单出现在小学生的考试中,也有时会出现在中考中。许多同学都喜欢做这种题,因…

MyEclipse+Tomcat+Oracle环境配置

个人使用的是eclipse-SDK-3.2.2-win32与MyEclipse 5.5 M2 Tomcat 使用的是5.0.28 Oracle 版本为9i 虽然各个版本略有不同,不过配置方法还是大同小异的。 1 eclipse和MyEclipse 解压安装,这个没什么好说的,装MyEclipse是各类版本与Eclipse相配…

java project 项目在 linux 下面部署步骤

出了某几点细小的差别,跟Windows的部署是完全一致的,具备通用性 首先,介绍一下部署步骤: 第一:安装jdk 第二:安装tomcat 第三:配置环境变量;在/etc/profile的最后追加: e…

SAI / PS绘画一个卡通女孩详解

本教程介绍使用SAI / PS绘画一个卡通女孩的教程 ,教程很详细,动起你的小手一起来试试吧! 软件下载:http://www.dongmansoft.com/xiazai.html 想要Get到更多有关优动漫的信息包括软件下载,可关注还可以关注http://www.d…

Java程序如何正确打包并正常运行在Linux系统中

需求:将本地Java程序部署到linux服务器并执行,首先要将本地Java程序打成jar包,然后拷贝到服务器后运行java -jar xx.jar 问题:该程序本地运行正常,服务端运行报错找不到第三方包中的类 原因:本地打jar包时有…

Cocos Creater学习笔记1 - 从0开始创建一个新项目并且做一个简单的按钮点击回调...

学习参考网站:http://www.cocoachina.com/bbs/read.php?tid460272 大部分内容可直接参考网站的内容,我只是记录一些我自己学习中遇到的问题。 1.变量命名问题 可能是因为版本不同的原因,我直接复制他代码下来是不能用的,后面调试…