【转】跨DLLnew delete问题

DLL的内存分配释放问题 Heap corruption 这是个很典型的问题,在MSDN上也有描述。问题 阅读详情

【转】跨DLLnew delete问题

转两篇文章来说这个问题的

链接1:https://blog.csdn.net/notebook2001a/article/details/6647850

链接2:https://blog.csdn.net/zj510/article/details/35290505  这篇文章疑点很多,有时间再细究,特别是下面这段

------------------------------------------------------------------------------------------------------------------------

根本原因

假设DLL是静态link crt (MT),EXE是动态link (MD)。我画了个示意图。

------------------------------------------------------------------------------------------------------------------------

个人理解:

动态链接与静态链接
静态链接:此时静态库就像一个obj文件一样被缝合进了EXE
试想若每个程序都把系统的库静态链接入自己中,N个程序将复制N份系统库,运行时将重复大量的内存
而动态链接库则是共享库只加载一份到内存中,各程序共同使用它。
因为每个进程都有自己的虚拟空间,这个空间就是CPU的寻址范围,32位CPU,寻址能力是4GB,
就是说32位CPU上,每个进程的虚拟内存都是4GB
那么,由于动态链接库不是缝合到EXE中的,因此也不能映射到EXE的进程中,
故,动态链接库加载到内存中时也是有独立的虚拟空间的,
这就引出了一个著名问题:跨链接库 NEW/DELETE的问题,
在一个DLL中用NEW申请内存,在另一个DLL或EXE中 DELETE释放内存可能会出现问题,

 

参考文章:

VS项目属性中C/C++运行库 、MT /MTd /MD /MDd

posted on 2018-08-08 14:33 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

C++动态库dll内存分配与释放问题总结 结论: 如果两个dll(或者exe调用dll)的CRT链接为MD,则可以动态库分配和释放;如果一个是MT,另一个是MD则会有问题(比如崩溃)。 利用虚函数的动态绑定技术,动态绑定分配释放内存的new和delete等,可以解决上述1的问题,例如shared_ptr的实现。但如果shared_ptr包装是vector等类型,在调用和被调用中都涉及到vector的修改的话,仍然会有问题,因为两个地方都会有释放和分配。 详情见以下两个文章: dll的内存分配释放问题 智能指针shared_ptr为何可以实 阅读详情

相关推荐

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

不同的DLL中完全可能会维护不同的局部堆,这与编译器的实现有关。有些编译器可以选择使用进程共享的局部堆,但性能会受影响。      如果是不同的局部堆,当你在DLL中new时,是在DLL的堆中分配的;而当你在EXE中delete时,EXE会认为它是在EXE的局部堆中分配的,

notebook2001a的专栏 3030

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

报错情况: 1,在 DLL 中用 new 来创建宿主程序中的对象,然后把这个对象指针保存到宿主程序,当 DLL 被卸载后,凡是涉及到这个指针的调用都会报错,包括 delete 这个指针也会有错。 2,在DLL中new出一个对象,然后在不需要使用时进行delete,结果会报如下错误: Windows has triggered a breakpoint in wsTest.exe. This

dodott的专栏 3902

[载]有关DLL中New和外部Delete以以及DLL传递对象的若干问题

Q:        我们需要在Dll中new一个class或者struct的实例,通过接口把这个实例传给了主程序(调用dll的程序),最后这个实例的释放(delete)是由主程序来执行的,这时我们的问题出现了,vs.net抛出一个debug模式下的异常,是在delete函数中。后来我试了另外一种情况,即在主程序中new的实例在dlldelete也会有相同的问题。哪位大侠知道为什么?    另

ssliao的专栏(程序感悟,人生体会) 1872

模块内存管理的陷阱

模块内存管理的陷阱 A.exe中加载B.dll.  在A.exe中用new申请了一片内存,在B.dll中执行delete导致程序崩溃。 原因: 模块内存管理不一致导致。A.exe是MD链接,B.dll是MT链接,有2个C++运行库运行在同一个地址空间上,有可能读写同样内存区域,导致程序崩溃。 解决办法:         每个模块自己管理内存。不要模块申请/释放内存.

quasiceo 1792

第十二讲 编译器下的new和delete内幕—————面向对象高级开发

1 编译器下的new和delete内幕 1.1 技术内幕 例子: #include <iostream> #include <cstdlib> class A{ public: A(){std::cout<<"constructor:"<<static_cast<void*>(this)<<std::endl;} ~A(){std::cout<<"destory:"<<static_cast&l

韩江雪de 小屋 409

dll中使用new和delete

 在 DLL 中用 new 来创建宿主程序中的对象,然后把这个对象指针保存到宿主程序,当 DLL 被卸载后,凡是涉及到这个指针的调用都会报错,包括 delete 这个指针也会有错。分析原因,因为new/delete使用的是局部堆(当然这与编译器可能也有关,但至少M$的编译器应该是这样的),也就是说不同的DLL虽然共享一个地址空间,但完全可能会维护不同的局部堆(堆分段),这与编译器的实现有关。有

四叶草的进化 3256

module(exe、dll)间传递c++对象发生申请/释放内存违例的问题

<br />即module(exe、dll)间申请/释放内存违例的问题,对发生在传递c++对象并使用时,不仅仅发生在std::string上 <br /><br />原因是由于程序中使用的内存管理多来源于crt提供的例程,而非直接使用操作系统的接口,这些例程都需要维护一些module全局数据(例如维护池、维护空闲块、或者标记已申请的块等等,不同的实现中有不同的作用),当他们被静态连编时,实际上这些“全局数据”就不“全局”了,不同的module各自为政,每份module都有自己的“全局数据”,自身的内存信息

achellies's Blog 2277
上一篇: 【常见CPU架构对比】维基百科
下一篇: 【转】PBR基于物理的渲染
时空观察者9号
博客等级 码龄19年 66粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值