DLL中New和外部Delete以及跨DLL传递对象的问题

DLL与EXE之间的内存管理可能引发问题,由于不同DLL可能拥有独立的局部堆,导致在DLL中new的对象在EXE中delete时可能出现错误。为确保安全释放,建议为类提供虚的free方法,统一管理内存。避免直接使用DLL提供的类成员函数,而是通过DLL导出创建和释放对象的函数,返回抽象类指针,调用对象的公共抽象free方法进行操作。
摘要由CSDN通过智能技术生成
不同的DLL中完全可能会维护不同的局部堆,这与编译器的实现有关。有些编译器可以选择使用进程共享的局部堆,但性能会受影响。 

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

        最好为你的class或struct提供一个虚的free方法,在里面调用delete。不管是从EXE中分配的还是从DLL中分配的,都可以安全地用free方法释放,因为free是虚的,它的代码会和分配它的代码编译在同一个可执行体中。 

        我不赞成用引出类的方法提供功能,因为类成员的签名生成并没有一个标准,很难使用。 

        用DLL提供的类最好是只引出创建对象的函数,返回类型是一个“纯抽象类”指针,我说的“纯抽象类”指没有成员变量,没有非抽象方法的类。并且有一个公开的抽象的free方法负责释放。使用时调用创建函数创建一个(衍生类)  的对象并返回,然后调用对象的成员方法来完成操作。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值