DLL中的Delete问题

sinfee 2011-02-28 04:35:13
我创建了一个对话框导出类封装在扩展DLL中,里面没有资源,只是为了处理数据与
继承使用,然后在主程序中创建了该导出类的子类,并创建一个无模式对话框如下:
EXPA.DLL中:
CExamDlg为导出类
其中有在OnClose()中
{
...
DestoryWindow();
delete this;
}

导出函数中:
bool ShowDlg(CExamDlg* pDlg,UINT nIDD)
{
pDlg->Create(nIDD,NULL);
pDlg->ShowWindow(SW_SHOW);
return true;
}
主程序中
CDlgB:public CExamDlg
然后
CDlgB* pDlg = new CDlgB();
ShowDlg(pDlg,CDlgB::IDD);

大家看到显示对话框是在底层,那么问题来了,
在关闭对话框时对话框调用OnClose(),在这个函数最后我delete this;

可是这个指针是在主程序中new的,现在要在DLL中进行delete,有什么隐患吗?

实际应用时发现没崩溃,但是new是在堆中分配的吧,主程序的堆和DLL中的堆
是一个地方吗?

delete时DLL中的父类并不知道子类的实际大小,不会出现泄露吗?

如果是DLL中的NEW的东东,在主程序中可以测试出会出现问题,反过来就可以吗?
这是什么道理?

请大家指点一下。
...全文
188 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinfee 2011-03-01
  • 打赏
  • 举报
回复
结了,感谢大家的帮助
dkl123zxc 2011-03-01
  • 打赏
  • 举报
回复
自己封装一个了类调用New,和Delete
cdsnpeter 2011-02-28
  • 打赏
  • 举报
回复
如果EXE和DLL有一个不是用动态链接CRT库(C runtime library)的方式使用CRT的话,或者是EXE和DLL动态链接的CRT库的版本不同时,EXE和DLL将会各自拥有各自的堆空间,所以在DLL中 new的东西务必在DLL中delete。
-------
这是那个帖子的一个说法。。。
Lactoferrin 2011-02-28
  • 打赏
  • 举报
回复

如果使用了crt的入口点,模块加载时会创建一份crt的堆
sinfee 2011-02-28
  • 打赏
  • 举报
回复
那意思是不是说如果是同一种CRT的话,free也没问题?可我试验的结果也不行啊
cdsnpeter 2011-02-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20070810/12/2387DE8D-4D6A-49A9-943E-6170A460F975.html贴个之前牛人们的讨论。楼主参考参考。
cdsnpeter 2011-02-28
  • 打赏
  • 举报
回复
如果dll和exe链接的是不同的CRT (C Runtime)的话, 那么你的DLL和EXE则不是同一个堆空间。
所以可想而知,你Delete不是同一个堆空间的对象,就会出问题。或者崩溃,或者内存泄漏。

所以你如果想这样干,保证Dll和EXE都链接同一个CRT,Project的编译选项你需要确保下是一样的CRT。
Lactoferrin 2011-02-28
  • 打赏
  • 举报
回复
free使用CRT自己的堆,这个堆在CRT初始化时创建
sinfee 2011-02-28
  • 打赏
  • 举报
回复
堆不分的话为什么在DLL里NEW出来的字符串,主程序里删除时会出错呢?

嗯 ,我以后在DLL中用strdup出来的串,在主程序里想free时就没成功过。
smwhotjay 2011-02-28
  • 打赏
  • 举报
回复
这个意思是说 a.exe里new了个类对象, dll里删除了这个类对象. 这个就需要统一下运行时库了.否则不同库,会造成内存泄露的. 看win core编程dll部分,讲了new delete的注意事项. 要么dll里统一new delete操作.
Lactoferrin 2011-02-28
  • 打赏
  • 举报
回复
堆不区分模块

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧