MFC CString内存泄漏,实在是无法理解

Karim_Benzema 2016-06-20 04:33:13
代码:
void CLeakStudyDlg::OnBnClickedButtonFind()
{
CString fa;
CString so;
m_edit_fa.GetWindowTextW(fa);
m_edit_so.GetWindowTextW(so);


if (fa == "")
{
AfxMessageBox(L"第一个字符串为空");
return;
}

if (so == "")
{
AfxMessageBox(L"第二个字符串为空");
return;
}

if (fa.Find(so) != -1)
{
m_edit_re.SetWindowTextW(so + L" is the sun_string of " + fa);
}

//AfxMessageBox(L"完成");

_CrtDumpMemoryLeaks();//放在程序跳出的地方, 检查内存泄漏
}
...全文
1686 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeonTeung 2018-06-10
  • 打赏
  • 举报
回复
https://stackoverflow.com/questions/23619031/could-this-be-a-false-positive-memory-leak-report 很有可能是程序中加载了不同版本的MFC库的问题。我也遇到了类似的问题,最终发现exe会同时加载MFC90Ud.dll和MFC120Ud.dll,原因是程序使用VS2013写的,其中一个DLL是用VS2008写的,最后将DLL在VS2013下编译并替换后,就不再出现这个问题了。
draculamx 2016-06-22
  • 打赏
  • 举报
回复
引用 5 楼 Karim_Benzema 的回复:
[quote=引用 4 楼 schlafenhamster 的回复:] 这样试试 不手动调用这个函数,可以通过调用_CrtSetDbgFlag函数设置_crtDbgFlag为_CRTDBG_LEAK_CHECK_DF,这样系统将在程序结束的时候,自动调用_CrtDumpMemoryLeaks函数,打印出所有内存泄露的信息。 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
http://bbs.csdn.net/topics/391968170 跟这个帖子里面的情况非常相似. 都是CString 出现内存泄漏问题,找不到原因.[/quote] 就是这个原因,不要手动调用 _CrtDumpMemoryLeaks函数 ,让系统自己调用,我昨天刚碰到这个问题。。。 还有,如果你用的是VC2010的话,不用加任何代码,他在DEBUG模式下都会自动监测内存泄漏的。。。
路杨 2016-06-22
  • 打赏
  • 举报
回复
引用 17 楼 akirya 的回复:
有对应的重载版,不需要GetBuffer void GetWindowText( CString& rString ) const;
多谢提醒, 一直用 VC6 貌似没有用过这个重载版。 记得当时刚开始使用 GetWindowText 的时候, 如果直接使用 CString, 不会报错,但是结果不可预期, 除非再次 format 一次。才可以正常输出。所以导致我现在对 GetWindowText 回来的 CString ,都会习惯性的 Format 一次。
schlafenhamster 2016-06-22
  • 打赏
  • 举报
回复
是 ShortcutSearch(CString str_path, CStdioFile &file) 有 leak? 这样说不清楚, 搞一个 确定 有 leak 的 CString 代码上来。
路杨 2016-06-21
  • 打赏
  • 举报
回复
使用 CString 如果习惯不好,很容易内存泄露,但是你1楼的测试是不对的。 你可以把所有的代码用 { } 扩起来,然后再在 } 后再次
_CrtDumpMemoryLeaks();
再看看结果。 另外,你使用了一个CString 到 LPTSTR 的强制转化。可能会带来一些小问题。 即:
m_edit_fa.GetWindowTextW(fa);
修改为
m_edit_fa.GetWindowTextW(fa.GetBuffer(MAX_PATH));
BeanJoy 2016-06-21
  • 打赏
  • 举报
回复
使用umdh检测一下,看看泄露的堆栈就知道了。
schlafenhamster 2016-06-21
  • 打赏
  • 举报
回复
vc6 上

void CDrawEditDlg::OnButton() 
{
	// TODO: Add your control notification handler code here
    CString fa="ABCDEFG";
    CString so="BCDEF";
    if (fa == "")
    {
        AfxMessageBox("第一个字符串为空");
        return;
    }
    if (so == "")
    {
        AfxMessageBox("第二个字符串为空");
        return;
    }
    if (fa.Find(so) != -1)
    {
        so += " is the sub_string of " + fa;
    }
 
    AfxMessageBox(so);
 
//`_CrtDumpMemoryLeaks();//不要这句 无 leak !!!
}
Karim_Benzema 2016-06-21
  • 打赏
  • 举报
回复
引用 10 楼 akirya 的回复:
[quote=引用 3 楼 Karim_Benzema 的回复:] [quote=引用 2 楼 homesos 的回复:] 临时变量还没被释放导致的吧,临时变量要在执行到结尾的大括号时才会被释放。
这个只是我的一个小例子. 我们现在的项目, 由于大量使用CString, 内存大量泄漏, 找不到原因.[/quote] 某些类使用 CString成员,然后这个类泄漏了,那么也会报CString内存泄漏的 CString这种高频率使用的类本身不会有内存泄漏的[/quote] 我也是这么想的.CString这种很成熟,而且很常用的类,要是有问题,微软和 MFC 早就关门了.
  • 打赏
  • 举报
回复
引用 15 楼 easunlee 的回复:
使用 CString 如果习惯不好,很容易内存泄露,但是你1楼的测试是不对的。 你可以把所有的代码用 { } 扩起来,然后再在 } 后再次
_CrtDumpMemoryLeaks();
再看看结果。 另外,你使用了一个CString 到 LPTSTR 的强制转化。可能会带来一些小问题。 即:
m_edit_fa.GetWindowTextW(fa);
修改为
m_edit_fa.GetWindowTextW(fa.GetBuffer(MAX_PATH));
有对应的重载版,不需要GetBuffer void GetWindowText( CString& rString ) const;
Karim_Benzema 2016-06-21
  • 打赏
  • 举报
回复
引用 15 楼 easunlee 的回复:
使用 CString 如果习惯不好,很容易内存泄露,但是你1楼的测试是不对的。 你可以把所有的代码用 { } 扩起来,然后再在 } 后再次
_CrtDumpMemoryLeaks();
再看看结果。 另外,你使用了一个CString 到 LPTSTR 的强制转化。可能会带来一些小问题。 即:
m_edit_fa.GetWindowTextW(fa);
修改为
m_edit_fa.GetWindowTextW(fa.GetBuffer(MAX_PATH));
多谢大神提醒
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
使用 GetBuffer 后 要 ReleaseBuffer
这个只会造成逻辑错误,不会内存泄漏的。
  • 打赏
  • 举报
回复
引用 3 楼 Karim_Benzema 的回复:
[quote=引用 2 楼 homesos 的回复:] 临时变量还没被释放导致的吧,临时变量要在执行到结尾的大括号时才会被释放。
这个只是我的一个小例子. 我们现在的项目, 由于大量使用CString, 内存大量泄漏, 找不到原因.[/quote] 某些类使用 CString成员,然后这个类泄漏了,那么也会报CString内存泄漏的 CString这种高频率使用的类本身不会有内存泄漏的
Karim_Benzema 2016-06-20
  • 打赏
  • 举报
回复
void CMiMouseDlg::ShortcutSearch(CString str_path, CStdioFile &file)
{
	CFileFind OneFile;
	CString name_file;
	CString name_dir = str_path + _T("\\*.*");
	BOOL iswork;
	iswork = OneFile.FindFile(name_dir);
	while (iswork)//成功的打开了一个文件夹
	{
		iswork = OneFile.FindNextFile();//获得一个"文件"
		if (OneFile.IsDots())
		{
			continue; //不是需要的文件,跳过继续寻找下一个File or Folder  
		}
		if (OneFile.IsDirectory())//当前的"文件"是文件夹,不是某一个文件
		{
			name_dir = OneFile.GetFilePath(); //获取文件夹的路径
			ShortcutSearch(name_dir, file);
		}
		else//当前的"file"是一个文件
		{
			name_file = OneFile.GetFileName();  //获取文件的名字
			if (name_file.Find(L"卸载") != -1 || name_file.Find(L"修复") != -1)
				continue;

			TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));//为了读取中文不至于乱码
			_tsetlocale(LC_CTYPE, _T("chs"));

			for (int i = 0; i < (int)shortcut_need.size(); i++)
			{
				//搜索到了 startmenu.sec 文件中的某一个快捷方式
				if (name_file.Find( shortcut_need[i].key ) != -1)
				{
					CString str_link;
					str_link = OneFile.GetFilePath();
					CString temp = shortcut_need[i].command + L"," + str_link + L"\n";

					file.WriteString(temp);
					break;
				}
			}

            _tsetlocale(LC_CTYPE, old_locale);
            free(old_locale);
		}
	}
	OneFile.Close();
}
Karim_Benzema 2016-06-20
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
使用 GetBuffer 后 要 ReleaseBuffer
您好,这个,我肯定知道啊.不过我没用GetBuffer, 只用了一般的 Format Find += + 等函数或运算符重载
Karim_Benzema 2016-06-20
  • 打赏
  • 举报
回复
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {410} normal block at 0x006DDD98, 24 bytes long. Data: < > A0 D7 F1 0F 03 00 00 00 03 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {409} normal block at 0x006DDD28, 52 bytes long. Data: < > A0 D7 F1 0F 11 00 00 00 11 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {407} normal block at 0x006DDCD0, 28 bytes long. Data: < > A0 D7 F1 0F 05 00 00 00 05 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {406} normal block at 0x006DDC68, 38 bytes long. Data: < > A0 D7 F1 0F 0A 00 00 00 0A 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {404} normal block at 0x006DDC10, 28 bytes long. Data: < > A0 D7 F1 0F 05 00 00 00 05 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {403} normal block at 0x006DDBA8, 42 bytes long. Data: < > A0 D7 F1 0F 0C 00 00 00 0C 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {401} normal block at 0x006DDB50, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {400} normal block at 0x006DDAF0, 36 bytes long. Data: < > A0 D7 F1 0F 09 00 00 00 09 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {398} normal block at 0x006DDA98, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {397} normal block at 0x006DDA30, 40 bytes long. Data: < > A0 D7 F1 0F 0B 00 00 00 0B 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {395} normal block at 0x006DD9D8, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {394} normal block at 0x006C4F88, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {391} normal block at 0x006DD8A8, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {390} normal block at 0x006C51F8, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {388} normal block at 0x006C5198, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {387} normal block at 0x006C5140, 22 bytes long. Data: < > A0 D7 F1 0F 02 00 00 00 02 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {385} normal block at 0x006C50E8, 24 bytes long. Data: < > A0 D7 F1 0F 03 00 00 00 03 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {384} normal block at 0x006C5090, 24 bytes long. Data: < > A0 D7 F1 0F 03 00 00 00 03 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {382} normal block at 0x006C5030, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {381} normal block at 0x0068E530, 22 bytes long. Data: < > A0 D7 F1 0F 02 00 00 00 02 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {378} normal block at 0x006C4F30, 28 bytes long. Data: < > A0 D7 F1 0F 05 00 00 00 05 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {377} normal block at 0x006C4ED0, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {375} normal block at 0x0068E670, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {374} normal block at 0x0068E618, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {372} normal block at 0x0068E5B8, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {371} normal block at 0x006BE3C8, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {368} normal block at 0x006AE4D0, 42 bytes long. Data: < > A0 D7 F1 0F 0C 00 00 00 0C 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {367} normal block at 0x006AE478, 28 bytes long. Data: < > A0 D7 F1 0F 05 00 00 00 05 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {365} normal block at 0x006AE420, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {364} normal block at 0x006BE308, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {361} normal block at 0x006BE368, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {360} normal block at 0x0065A988, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {357} normal block at 0x006B1530, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {356} normal block at 0x006B14D0, 32 bytes long. Data: < > A0 D7 F1 0F 07 00 00 00 07 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {353} normal block at 0x0065A928, 34 bytes long. Data: < > A0 D7 F1 0F 08 00 00 00 08 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {352} normal block at 0x006B0DC0, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {349} normal block at 0x00692710, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {348} normal block at 0x006926B8, 26 bytes long. Data: < > A0 D7 F1 0F 04 00 00 00 04 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {345} normal block at 0x006A1EF8, 28 bytes long. Data: < > A0 D7 F1 0F 05 00 00 00 05 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {344} normal block at 0x006BEF48, 24 bytes long. Data: < > A0 D7 F1 0F 03 00 00 00 03 00 00 00 01 00 00 00 {338} normal block at 0x006B11C8, 104 bytes long. Data: <C h i n e s e > 43 00 68 00 69 00 6E 00 65 00 73 00 65 00 20 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {315} normal block at 0x006BED30, 58 bytes long. Data: < > A0 D7 F1 0F 14 00 00 00 14 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {314} normal block at 0x006C02B8, 24 bytes long. Data: < > A0 D7 F1 0F 03 00 00 00 03 00 00 00 01 00 00 00 f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {291} normal block at 0x006A0708, 40 bytes long. Data: < > A0 D7 F1 0F 0B 00 00 00 0B 00 00 00 01 00 00 00
schlafenhamster 2016-06-20
  • 打赏
  • 举报
回复
使用 GetBuffer 后 要 ReleaseBuffer
Karim_Benzema 2016-06-20
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
这样试试 不手动调用这个函数,可以通过调用_CrtSetDbgFlag函数设置_crtDbgFlag为_CRTDBG_LEAK_CHECK_DF,这样系统将在程序结束的时候,自动调用_CrtDumpMemoryLeaks函数,打印出所有内存泄露的信息。 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
http://bbs.csdn.net/topics/391968170 跟这个帖子里面的情况非常相似. 都是CString 出现内存泄漏问题,找不到原因.
schlafenhamster 2016-06-20
  • 打赏
  • 举报
回复
这样试试 不手动调用这个函数,可以通过调用_CrtSetDbgFlag函数设置_crtDbgFlag为_CRTDBG_LEAK_CHECK_DF,这样系统将在程序结束的时候,自动调用_CrtDumpMemoryLeaks函数,打印出所有内存泄露的信息。 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
Karim_Benzema 2016-06-20
  • 打赏
  • 举报
回复
引用 2 楼 homesos 的回复:
临时变量还没被释放导致的吧,临时变量要在执行到结尾的大括号时才会被释放。
这个只是我的一个小例子. 我们现在的项目, 由于大量使用CString, 内存大量泄漏, 找不到原因.
加载更多回复(2)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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