DLL内存分配问题

LL596214569 2019-07-08 09:12:42
C++写的一个画图动态库,有一个静态接口是用来创建画图的对话框,但是在我调用这个函数的时候,在使用几次之后再调用得到的对话框指针地址就会全变成一样的,有没有大佬遇见过这种问题,是给DLL分配的内存不够用了吗?
...全文
2157 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
neo_liang 2019-07-11
  • 打赏
  • 举报
回复
应该是 堆内存管理的问题。
LL596214569 2019-07-10
  • 打赏
  • 举报
回复
引用 16 楼 一彤 的回复:
[quote=引用 14 楼 的回复:] [quote=引用 13 楼 636f6c696e 的回复:] 那只有一个可能,你创建出来的对象被释放了,因此重新申请的对象地址恰好和之前一样 [quote=引用 10 楼 的回复:] [quote=引用 8 楼 636f6c696e 的回复:] 内部对对象实例做了管控呗,参考单例模式的实现方式
没有,动态库只是创建一个指针传递出来,对这个对象析构也是我从外界再将指针传进动态库去destroy,动态库内部不会保存创建的任何对象的地址,所有对对象的操作都是我在外界进行的,动态库只负责提供接口创建和回收[/quote][/quote] 没错。。。我终于查到了,蠢得不行的一个问题;这个问题是因为外界指针没有置空导致与下一次申请的地址重合导致的; 具体说就是我EXE中使用了一个指针保存DLL中new出来的对话框,然后对话框关闭时我是靠postncdestroy去delete this去回收,然后因为EXE中用到这个对话框指针的地方只有show与delete,所以这个指针之前没有置空,就导致某一次没有置空的指针的地址恰好等于下一次new出来的地址,于是导致两个指针指向了同一个地址; 修改了一下动态库,每次destroy对话框的时候给EXE的父对话框发送一个消息把指针置空就没问题了[/quote] win7下的问题,win10每次申请的内存地址都会不同[/quote] 是win7下的问题,但是按我的理解应该是系统给DLL分配了一块内存,然后这块内存如果都被用过一遍之后(用完都正确释放了)再在DLL里面申请内存的时候不是会从这个内存的起点开始分配吗?
一彤 2019-07-10
  • 打赏
  • 举报
回复
引用 14 楼 的回复:
[quote=引用 13 楼 636f6c696e 的回复:] 那只有一个可能,你创建出来的对象被释放了,因此重新申请的对象地址恰好和之前一样 [quote=引用 10 楼 的回复:] [quote=引用 8 楼 636f6c696e 的回复:] 内部对对象实例做了管控呗,参考单例模式的实现方式
没有,动态库只是创建一个指针传递出来,对这个对象析构也是我从外界再将指针传进动态库去destroy,动态库内部不会保存创建的任何对象的地址,所有对对象的操作都是我在外界进行的,动态库只负责提供接口创建和回收[/quote][/quote] 没错。。。我终于查到了,蠢得不行的一个问题;这个问题是因为外界指针没有置空导致与下一次申请的地址重合导致的; 具体说就是我EXE中使用了一个指针保存DLL中new出来的对话框,然后对话框关闭时我是靠postncdestroy去delete this去回收,然后因为EXE中用到这个对话框指针的地方只有show与delete,所以这个指针之前没有置空,就导致某一次没有置空的指针的地址恰好等于下一次new出来的地址,于是导致两个指针指向了同一个地址; 修改了一下动态库,每次destroy对话框的时候给EXE的父对话框发送一个消息把指针置空就没问题了[/quote] win7下的问题,win10每次申请的内存地址都会不同
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
3楼的就是动态库内调用的函数,这个函数是static的,根据调试发现,调用几次之后得到的pDlg就每次都是相同的地址
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
CFmlAnalysisDlg* ExportAnalysisDlg::ShowDlg(CTestResultBillEx* pBill, int* iType, CDialog*  pParentDlg, CDPIFont* pFont)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
	gFont = pFont;
	CFmlAnalysisDlg* pDlg = new CFmlAnalysisDlg;
	pDlg->Create(IDD_FML_ANALYSIS_DLG, pBill, iType, pParentDlg);
	//m_pDlg->ShowWindow(SW_SHOW);
	return pDlg;
}
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
引用 1 楼 gouyanfen 的回复:
[quote=引用 楼主 的回复:] C++写的一个画图动态库,有一个静态接口是用来创建画图的对话框,但是在我调用这个函数的时候,在使用几次之后再调用得到的对话框指针地址就会全变成一样的,有没有大佬遇见过这种问题,是给DLL分配的内存不够用了吗?
静态类只在内存中保存一份,如果对话框指针也是静态成员,那肯定就会只保存最后一份了[/quote] 对话框指针不是静态的,只是new对象的那个函数是静态的,而且是开始new几次是正常的,new几次之后才会每次都得到相同的地址
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
但是我发现一个新问题,我从DLL向EXE中发送消息时,定义的消息号不同会导致有时收不到消息,测试发现在我的环境下 WM_USER + 5000到6000 之间是可以正常处理的,但是 WM_USER + 6000以上消息响应函数就响应不到了。。。。有没有大佬知道怎么个原理
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
引用 13 楼 636f6c696e 的回复:
那只有一个可能,你创建出来的对象被释放了,因此重新申请的对象地址恰好和之前一样 [quote=引用 10 楼 的回复:] [quote=引用 8 楼 636f6c696e 的回复:] 内部对对象实例做了管控呗,参考单例模式的实现方式
没有,动态库只是创建一个指针传递出来,对这个对象析构也是我从外界再将指针传进动态库去destroy,动态库内部不会保存创建的任何对象的地址,所有对对象的操作都是我在外界进行的,动态库只负责提供接口创建和回收[/quote][/quote] 没错。。。我终于查到了,蠢得不行的一个问题;这个问题是因为外界指针没有置空导致与下一次申请的地址重合导致的; 具体说就是我EXE中使用了一个指针保存DLL中new出来的对话框,然后对话框关闭时我是靠postncdestroy去delete this去回收,然后因为EXE中用到这个对话框指针的地方只有show与delete,所以这个指针之前没有置空,就导致某一次没有置空的指针的地址恰好等于下一次new出来的地址,于是导致两个指针指向了同一个地址; 修改了一下动态库,每次destroy对话框的时候给EXE的父对话框发送一个消息把指针置空就没问题了
636f6c696e 2019-07-09
  • 打赏
  • 举报
回复
那只有一个可能,你创建出来的对象被释放了,因此重新申请的对象地址恰好和之前一样
引用 10 楼 的回复:
[quote=引用 8 楼 636f6c696e 的回复:] 内部对对象实例做了管控呗,参考单例模式的实现方式
没有,动态库只是创建一个指针传递出来,对这个对象析构也是我从外界再将指针传进动态库去destroy,动态库内部不会保存创建的任何对象的地址,所有对对象的操作都是我在外界进行的,动态库只负责提供接口创建和回收[/quote]
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
引用 11 楼 gouyanfen 的回复:
[quote=引用 10 楼 的回复:] [quote=引用 8 楼 636f6c696e 的回复:] 内部对对象实例做了管控呗,参考单例模式的实现方式
没有,动态库只是创建一个指针传递出来,对这个对象析构也是我从外界再将指针传进动态库去destroy,动态库内部不会保存创建的任何对象的地址,所有对对象的操作都是我在外界进行的,动态库只负责提供接口创建和回收[/quote] 为什么要传指针呢?外界操作对象,自定义消息处理就可以了,你的问题应该不是出在这里[/quote] 其实外界也没有什么操作,就是用指针显示这个对话框还有为这个指针设置父窗口用来析构,所以这个动态库只定义了new和destroy的接口。我也感觉应该是外界使用的有问题,但是还没想出来问题出在哪
gouyanfen 2019-07-09
  • 打赏
  • 举报
回复
引用 10 楼 的回复:
[quote=引用 8 楼 636f6c696e 的回复:] 内部对对象实例做了管控呗,参考单例模式的实现方式
没有,动态库只是创建一个指针传递出来,对这个对象析构也是我从外界再将指针传进动态库去destroy,动态库内部不会保存创建的任何对象的地址,所有对对象的操作都是我在外界进行的,动态库只负责提供接口创建和回收[/quote] 为什么要传指针呢?外界操作对象,自定义消息处理就可以了,你的问题应该不是出在这里
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
引用 8 楼 636f6c696e 的回复:
内部对对象实例做了管控呗,参考单例模式的实现方式
没有,动态库只是创建一个指针传递出来,对这个对象析构也是我从外界再将指针传进动态库去destroy,动态库内部不会保存创建的任何对象的地址,所有对对象的操作都是我在外界进行的,动态库只负责提供接口创建和回收
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
引用 7 楼 gouyanfen 的回复:
[quote=引用 6 楼 的回复:] [quote=引用 5 楼 gouyanfen 的回复:] [quote=引用 3 楼 的回复:]
CFmlAnalysisDlg* ExportAnalysisDlg::ShowDlg(CTestResultBillEx* pBill, int* iType, CDialog*  pParentDlg, CDPIFont* pFont)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
	gFont = pFont;
	CFmlAnalysisDlg* pDlg = new CFmlAnalysisDlg;
	pDlg->Create(IDD_FML_ANALYSIS_DLG, pBill, iType, pParentDlg);
	//m_pDlg->ShowWindow(SW_SHOW);
	return pDlg;
}
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CoInitialize(NULL); AfxEnableControlContainer(); [/quote] 加的这两句我查了一下大概是在初始化COM控件和兼容控件容器,但是对我的问题好像没有用啊。。。我new出来的对话框就是一个继承自CDialog的自绘对话框,并没有用到特殊控件什么的。。[/quote] 那你就重创建个对话框什么都不要添加,看看有什么不同,对比一下[/quote] 对话框没问题,因为刚开始创建的几个对话框都是正常的,指针地址也没问题,是创建过几次对话框之后才会出现的问题
636f6c696e 2019-07-09
  • 打赏
  • 举报
回复
内部对对象实例做了管控呗,参考单例模式的实现方式
gouyanfen 2019-07-09
  • 打赏
  • 举报
回复
引用 6 楼 的回复:
[quote=引用 5 楼 gouyanfen 的回复:] [quote=引用 3 楼 的回复:]
CFmlAnalysisDlg* ExportAnalysisDlg::ShowDlg(CTestResultBillEx* pBill, int* iType, CDialog*  pParentDlg, CDPIFont* pFont)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
	gFont = pFont;
	CFmlAnalysisDlg* pDlg = new CFmlAnalysisDlg;
	pDlg->Create(IDD_FML_ANALYSIS_DLG, pBill, iType, pParentDlg);
	//m_pDlg->ShowWindow(SW_SHOW);
	return pDlg;
}
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CoInitialize(NULL); AfxEnableControlContainer(); [/quote] 加的这两句我查了一下大概是在初始化COM控件和兼容控件容器,但是对我的问题好像没有用啊。。。我new出来的对话框就是一个继承自CDialog的自绘对话框,并没有用到特殊控件什么的。。[/quote] 那你就重创建个对话框什么都不要添加,看看有什么不同,对比一下
LL596214569 2019-07-09
  • 打赏
  • 举报
回复
引用 5 楼 gouyanfen 的回复:
[quote=引用 3 楼 的回复:]
CFmlAnalysisDlg* ExportAnalysisDlg::ShowDlg(CTestResultBillEx* pBill, int* iType, CDialog*  pParentDlg, CDPIFont* pFont)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
	gFont = pFont;
	CFmlAnalysisDlg* pDlg = new CFmlAnalysisDlg;
	pDlg->Create(IDD_FML_ANALYSIS_DLG, pBill, iType, pParentDlg);
	//m_pDlg->ShowWindow(SW_SHOW);
	return pDlg;
}
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CoInitialize(NULL); AfxEnableControlContainer(); [/quote] 加的这两句我查了一下大概是在初始化COM控件和兼容控件容器,但是对我的问题好像没有用啊。。。我new出来的对话框就是一个继承自CDialog的自绘对话框,并没有用到特殊控件什么的。。
gouyanfen 2019-07-09
  • 打赏
  • 举报
回复
引用 3 楼 的回复:
CFmlAnalysisDlg* ExportAnalysisDlg::ShowDlg(CTestResultBillEx* pBill, int* iType, CDialog*  pParentDlg, CDPIFont* pFont)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
	gFont = pFont;
	CFmlAnalysisDlg* pDlg = new CFmlAnalysisDlg;
	pDlg->Create(IDD_FML_ANALYSIS_DLG, pBill, iType, pParentDlg);
	//m_pDlg->ShowWindow(SW_SHOW);
	return pDlg;
}
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CoInitialize(NULL); AfxEnableControlContainer();
gouyanfen 2019-07-08
  • 打赏
  • 举报
回复
引用 楼主 的回复:
C++写的一个画图动态库,有一个静态接口是用来创建画图的对话框,但是在我调用这个函数的时候,在使用几次之后再调用得到的对话框指针地址就会全变成一样的,有没有大佬遇见过这种问题,是给DLL分配的内存不够用了吗?
静态类只在内存中保存一份,如果对话框指针也是静态成员,那肯定就会只保存最后一份了

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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