我创建了一个对话框导出类封装在扩展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的东东,在主程序中可以测试出会出现问题,反过来就可以吗?
这是什么道理?请大家指点一下。
继承使用,然后在主程序中创建了该导出类的子类,并创建一个无模式对话框如下:
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的东东,在主程序中可以测试出会出现问题,反过来就可以吗?
这是什么道理?请大家指点一下。
所以可想而知,你Delete不是同一个堆空间的对象,就会出问题。或者崩溃,或者内存泄漏。所以你如果想这样干,保证Dll和EXE都链接同一个CRT,Project的编译选项你需要确保下是一样的CRT。
如果使用了crt的入口点,模块加载时会创建一份crt的堆
-------
这是那个帖子的一个说法