hur.cn - 华软网

 热门搜索

DLL中new个结构体postmessage到主线程(窗口)中去delete,会有什么问题

  作者:未知    来源:网络    更新时间:2011/9/30
RT,暂不考虑用sendmessage代替,除了不符合编码规范(毕竟没有义务去delete外部传来的一个指针)还有什么问题没,如果有应该怎样处理这种问题。请指教。
---华软 网友回答---
没有问题。
---华软网友回复---
楼上兄弟换头像了啊,感谢答复先,蛮热心的。
---华软网友回复---
  class="deleted_message"> 该回复于2011-10-09 09:15:37被版主删除
---华软网友回复---
问题大大地,跨模块释放,最好DLL再提供一个API专门用于释放内存,主线程调用这个API来释放就正常了
---华软网友回复---
直接delete,会引起内存非法访问。
---华软网友回复---
最好是谁new,谁就负责delete
---华软网友回复---
回4楼:跨模块,能用到传进来的指针为什么就不能delete,按我的理解跨模块的话传进来的指针应该都是无效的
回5楼:你确定么
回6楼:原则上是这样的,但我想知道如果DLL里NEW出来,然后UI中去delete到底哪里不妥,我知道不妥但是具体又不知道原因。
---华软网友回复---
引用 7 楼 dahaii0 的回复:
回4楼:跨模块,能用到传进来的指针为什么就不能delete,按我的理解跨模块的话传进来的指针应该都是无效的
回5楼:你确定么
回6楼:原则上是这样的,但我想知道如果DLL里NEW出来,然后UI中去delete到底哪里不妥,我知道不妥但是具体又不知道原因。

如果你使用的c run-time library静态库版本的话,DLL中new,EXE中delete,程序肯定崩溃,动态库则问题
---华软网友回复---
如果使用的静态库的话,EXE和DLL各自拥有独自的堆(Heap)空间,当你在DLL中new时,是在DLL的堆中分配的;而当你在EXE中delete时,EXE会认为它是在EXE的局部堆中分配的,从而用EXE的堆信息去释放它,从而可能导致错误。具体情况与堆管理代码的实现有关。 

---华软网友回复---
兔子解释得很好,学习了
---华软网友回复---
引用 9 楼 visualeleven 的回复:
如果使用的静态库的话,EXE和DLL各自拥有独自的堆(Heap)空间,当你在DLL中new时,是在DLL的堆中分配的;而当你在EXE中delete时,EXE会认为它是在EXE的局部堆中分配的,从而用EXE的堆信息去释放它,从而可能导致错误。具体情况与堆管理代码的实现有关。

多谢。
---华软网友回复---
如果使用的静态库的话,EXE和DLL各自拥有独自的堆(Heap)空间,当你在DLL中new时,是在DLL的堆中分配的;
---------------
这种情况下传过去的指针应该是无效的吧。传的是DLL堆中的地址,但在exe中这个地址只是个同名的未知地址,我这样理解对吧
---华软网友回复---
哎,基础差啊,要多看书了。。
---华软网友回复---
引用 8 楼 visualeleven 的回复:
引用 7 楼 dahaii0 的回复:

回4楼:跨模块,能用到传进来的指针为什么就不能delete,按我的理解跨模块的话传进来的指针应该都是无效的
回5楼:你确定么
回6楼:原则上是这样的,但我想知道如果DLL里NEW出来,然后UI中去delete到底哪里不妥,我知道不妥但是具体又不知道原因。

如果你使用的c run-time library静态库版本的话,DLL中new,EXE中……


感谢细节解答,我一直是这样用,常在DLL中new,同样,释放(delete)也是在DLL中做的,但是常常是由EXE去调用DLL中的方法来释放。没有出现过问题,哪怕分配和回收不是同一线程,但保证同一对象。
---华软网友回复---
指针可以跨模块使用,但释放内存不行。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。