MFC的内存泄漏调试方法(MFC中CString的泄漏)(DLL中全局变量导致的内存增长)

本文分析了Windows环境使用MFC调试内存泄露的技术,介绍了在Windows环境下用VS2019下查找,定位和消除内存泄露的方法技巧

基础配置:

1.开发系统:Win10

2.开发IDE: VS2013

问题点列举:

这几天公司的SDK在循环测试中发生的几个问题这里作为记录。主要是一下几个问题

一:MFC中CString的泄漏

二:DLL在MFC中应用导致内存增长

三:内存泄漏的调试方法

 

问题的总结:

一:MFC中CString的泄漏

 

二:DLL在MFC中应用导致内存增长

在循环测试的过程中发现内存在不停的增长 并且此时我的dll中使用了两个函数 我将函数简化如下但是发现内存依旧会增长。通过查询资料发现 DLL中有全局变量可能会造成这种情况 好吧 也不知道为什么只能这里先做个记录

//其中count为函数计数器

int open()
{
    count++;
    count--;
    return 0;
}

int close()
{
    count++;
    count--;
    return 0;
}

三:内存泄漏的调试方法

 这里先列举几个更加详细的使用方法 但是他们都是用vc++ 我这里使用的是vs2019 不过道理都是一样只是函数有所更新

1.关于MFC下检查和消除内存泄露的技巧                                                                      链接

2.VS2017的C++开发心得(十一)调试——内存溢出和内存泄漏(上)                      链接

3.国外的一篇文章讲的也很不错          https://mariusbancila.ro/blog/2010/07/12/how-to-find-the-source-of-memory-leaks/

我简单的说一下调试步骤

     先放个段代码

#include <stdio.h>

//1.放库函数
#define CRTDBG_MAP_ALLOC//这句一定要在库之前
#include <crtdbg.h>


 
double test()
{
	double *t = new double[2];//new的内存并没有释放
	return t[2];//访问越界,内存溢出

  _CrtDumpMemoryLeaks();//2.放监视的
}
 
int main()
{
	double k = test();
	return (int)k;
}

 

       1.添加头文件依赖

#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>

      2.在怀疑泄漏的函数结尾添加

_CrtDumpMemoryLeaks();

      3.切换Debug下调试

      4.打开Watch监视器 在Watch窗口中输入(不同的VS版本可能不一样)我使用的是vs2019

(int*){,,msvcr120d.dll}_crtBreakAlloc

    5.在此监视下 添加监视参数(后续在添加我的示例图这里先暂时用一下)

比如下面内存泄漏那句  你就可以讲Value设置为86 zai进行Debug 你就会发现运行到泄漏的地方就会停下来哈哈哈

那么怎么判断有内存泄漏呢

在调试状态下运行,程序退出后在"输出窗口"可以看到有无内存泄露。如果出现

Detected memory leaks! 
Dumping objects -> 


//啊啊啊 我泄露了 我漏了
F: CodeSample Test TestPipe LeakTest MainFrm.cpp(54) : {86} normal block at 0x00422E80, 10 bytes long.
Data: <          > 1F 1F 1F 1F 1F CD CD CD CD CD

就有内存泄露。

 

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt使用MFC的例子可以使用CString、MessageBox等MFC类和方法,具体如下: 1. 字符串操作:Qt没有类似MFC的CString类,但可以使用QString类进行字符串操作。QString类提供了丰富的字符串处理方法,如拼接字符串、查找子字符串、替换字符串等。 例如,使用MFC的CString类进行字符串拼接可以如下所示: CString str1 = "Hello"; CString str2 = "World"; CString result = str1 + " " + str2; 而在Qt,可以使用QString类的arg()函数实现字符串的格式化和拼接: QString str1 = "Hello"; QString str2 = "World"; QString result = QString("%1 %2").arg(str1).arg(str2); 2. 消息框:在MFC,可以使用CMessageBox类弹出对话框进行消息提示。 而在Qt,可以使用QMessageBox类实现类似的功能。QMessageBox类提供了丰富的静态函数用于弹出对话框,如information()、warning()、critical()等。它们分别用于显示不同类型的消息框。 例如,使用MFC的CMessageBox类弹出一个提示消息框可以如下所示: CMessageBox::Information("提示", "欢迎使用MFC"); 而在Qt,可以使用QMessageBox类的information()函数实现类似的效果: QMessageBox::information(nullptr, "提示", "欢迎使用Qt"); 以上是在Qt使用MFC的例子,使用了QString类代替了MFC的CString类,并使用了QMessageBox类代替了MFC的CMessageBox类,以实现字符串操作和消息框的功能。 ### 回答2: 在Qt使用MFC的类和方法可以通过将MFC的头文件包含到Qt项目来实现。下面是一个使用MFC的例子: 首先,在Qt项目的.pro文件添加MFC库的链接,例如: ``` LIBS += -L"path/to/mfc/library" -lmfc140u ``` 然后,在Qt的代码包含MFC的头文件和定义MFC的字符串类型`CString`。例如: ```cpp #include <afxwin.h> #include <afxdlgs.h> typedef CStringA MFCString; // 将CString转换为Qt项目String类型 void showDialog() { MFCString message = "Hello MFC"; MessageBoxA(NULL, message, "MFC Example", MB_OK); } ``` 在上面的例子,我们使用了MFC的`MessageBoxA`方法显示一个消息框,同时使用了MFC的`CString`字符串类型。在Qt项目,我们通过将`CString`定义为`CStringA`来使用MFC的字符串类型,并将其转换为Qt项目的字符串类型。 这只是一个简单的例子,你可以根据实际需求,使用更多的MFC类和方法,在Qt项目集成MFC的功能。需要注意的是,在使用MFC的类和方法时,可能会存在一些平台相关性的问题,需要根据具体的情况进行调整和处理。 ### 回答3: 在Qt使用MFC的例子,可以使用MFC的类和方法,如CString和MessageBox。 例如,我们可以在Qt创建一个按钮,当点击这个按钮时,弹出一个消息框,消息框显示一个使用CString拼接的字符串。 以下是一个使用MFC字符串和消息框的示例代码: ```cpp #include <QtWidgets> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { QPushButton *button = new QPushButton("点击我", this); connect(button, &QPushButton::clicked, this, &MainWindow::showMessageBox); } public slots: void showMessageBox() { CString str1 = _T("Hello"); CString str2 = _T("MFC"); CString concatStr; concatStr.Format(_T("%s %s"), str1, str2); QMessageBox::information(this, "消息框标题", (const char*)CT2CA(concatStr)); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } #include "main.moc" ``` 在上面的例子,我们在MainWindow的构造函数创建了一个按钮,并连接了按钮的clicked信号到showMessageBox槽函数。当按钮被点击时,就会触发showMessageBox函数。 showMessageBox函数,我们首先使用CString来创建两个字符串。然后使用CString的Format方法来将这两个字符串拼接成一个新的字符串。最后,我们使用QMessageBox::information方法创建一个消息框,并将拼接后的字符串转换成char*类型的参数传进去,实现字符串的显示。 运行这个例子,当点击按钮时,就会弹出一个消息框,消息框显示"Hello MFC"这个字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值