在动态库中创建的非模态对话框delete时为什么会出错?

jadechen 2010-03-20 01:41:35
我的DLL中输出一个函数,输出函数内容如下:

exterm "c" __declspec(dllimport) void MyFunc()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CADlg a;
a.DoModal();
}

在CADlg的构造函数中new了两个非模态对话框

{
m_pB=new CBDlg;
m_pB->Create(IDD_B_DLG);
m_pC=new CCDlg;
m_pC->Create(IDD_C_DLG);
}

在关闭CADlg对话框时删除这两个对话框

CADlg::OnClose()
{
delete m_pB;
delete m_pC;
}

在主程序中用LoadLibrary显式调用DLL,执行输出函数

问题来了
在调试的时候发现,执行delete m_pB;这句时居然m_pC指向的内容也变了
导致delete m_pC;时程序出错。这是为什么啊?
之前看csdn上有人说是虚函数表、对象析构什么的问题
但讲的不清楚,还望高人指教,谢谢~!

...全文
361 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jadechen 2010-03-25
  • 打赏
  • 举报
回复
谢谢
我去试下
cnzdgs 2010-03-25
  • 打赏
  • 举报
回复
根据你的描述来分析,可以这样来解释(我没有做过验证,你可以自己跟踪MFC的代码来分析):如果Create时不指定父窗口,MFC会把主窗口作为其父窗口。因为你是在A的构造函数中创建的B和C,此时A还没有创建,在创建C时,MFC把B设置成了C的父窗口,在销毁B(C的父窗口)的时候,MFC把C也销毁了。
用户 昵称 2010-03-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/ruoyuseu/archive/2009/03/02/3951091.aspx
jadechen 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cnzdgs 的回复:]
自己写的代码还有哪些?
可以先试试在调用Create函数创建这两个非模态对话窗时指定第2参数pParentWnd,例如给this或者给CWnd::GetDesktopWindow()。
[/Quote]
设置了下父窗口,居然可以了,这是为什么啊?
先给分,麻烦讲解下原因
dong364 2010-03-24
  • 打赏
  • 举报
回复
先问下,lz你是单线程还是多线程,如果是多线程就要考虑安全性
cnzdgs 2010-03-24
  • 打赏
  • 举报
回复
自己写的代码还有哪些?
可以先试试在调用Create函数创建这两个非模态对话窗时指定第2参数pParentWnd,例如给this或者给CWnd::GetDesktopWindow()。
jadechen 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jennyvenus 的回复:]
http://blog.csdn.net/ruoyuseu/archive/2009/03/02/3951091.aspx
[/Quote]
我的DLL是规则DLL,不是扩展DLL

另外我确实没有再写什么代码了,因为这个程序是用来测试了
除了我上面敲出来的,其他都是自动生成的
cnzdg说的设置父窗口的方法我下午试下,不过,我觉得应该没什么用
cnzdgs 2010-03-23
  • 打赏
  • 举报
回复
CBDlg中写了哪些代码?
jadechen 2010-03-23
  • 打赏
  • 举报
回复
空的,VC自动生成的
自己没加一句话
jadechen 2010-03-22
  • 打赏
  • 举报
回复
来个高人给看下啊~!
jadechen 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
要先DestroyWindow,然后再delete。
另外,对于这两个非模态对话框,通常的做法是在构造函数中new,在OnCreate或OnInitDialog函数中Create,在OnClose或OnDestroy中DestroyWindow,在析构函数中delete。
[/Quote]

用了你的办法,还是不行啊
m_pB->DestroyWindow();后,m_pC的句柄马上变成0x00000000了

其实在hdxy(行天之妖)的两个帖子里讲了一个和我这类似的问题

http://topic.csdn.net/t/20050124/17/3750278.html
http://community.csdn.net/Expert/topic/3754/3754471.xml?temp=.6655542

roger_ding(海天一色)给出了原因,不过这人太牛了,看汇编比看代码还快,崇拜啊~!
他说的我看不太明白,我觉得和我这应该是类似的问题
只是hdxy(行天之妖)是在DLL里new,外面delete
我的new和delete都是在DLL里,按说更不应该有问题
lmxmx 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
要先DestroyWindow,然后再delete。
另外,对于这两个非模态对话框,通常的做法是在构造函数中new,在OnCreate或OnInitDialog函数中Create,在OnClose或OnDestroy中DestroyWindow,在析构函数中delete。
[/Quote]

学习了!
cnzdgs 2010-03-21
  • 打赏
  • 举报
回复
要先DestroyWindow,然后再delete。
另外,对于这两个非模态对话框,通常的做法是在构造函数中new,在OnCreate或OnInitDialog函数中Create,在OnClose或OnDestroy中DestroyWindow,在析构函数中delete。
jadechen 2010-03-21
  • 打赏
  • 举报
回复
大牛来了
不过我上面的代码如果都在exe中没有问题,就是放到动态库中才有这问题

我下午去试下你说的
感谢~!
jadechen 2010-03-21
  • 打赏
  • 举报
回复
使用这三个对话框的程序也是什么都没写
因为我是别的程序出了问题,于是就写了上面这个空的程序和DLL来测试这个问题的
你可以按我上面说的建个DLL,debug下看是不是会这样

CBDlg和CCDlg的声明和析构都是VC自己生成的,我没有改动

另外我用的IDE是VC6.0
WizardK 2010-03-20
  • 打赏
  • 举报
回复
CBDlg和CCDlg怎么声明的?析构里做什么?
arong1234 2010-03-20
  • 打赏
  • 举报
回复
但是使用这三个对话框的程序也是什么都没写么?内存访问越界不是局限于你这个对话框或者这个dll的,只要你进程内有这样的问题,就可能导致稀奇古怪的问题

看看:http://blog.vckbase.com/arong/archive/2009/12/30/40598.html
[Quote=引用 3 楼 jadechen 的回复:]
可是我这个程序是实验用的,CADlg,CBDlg,CCDlg;都是空的什么也没写
应该不会动到内存阿
[/Quote]
jadechen 2010-03-20
  • 打赏
  • 举报
回复
可是我这个程序是实验用的,CADlg,CBDlg,CCDlg;都是空的什么也没写
应该不会动到内存阿
arong1234 2010-03-20
  • 打赏
  • 举报
回复
怀疑内存访问越界
jadechen 2010-03-20
  • 打赏
  • 举报
回复
来个大侠帮忙看看啊~!

15,473

社区成员

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

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