请教一个关于内存泄漏的问题。

ilmenau 2010-04-28 03:44:55
首先说明一下,我在网上搜到了一些在VC下检测内存泄漏的方法,方法很好用。直接搜索内存泄漏就有。

我的问题是着样的。
比如下面的例子代码
例子很简单就是new了2个数组,一个在函数test中,
函数test将被反复调用。

// test3.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
//#include <process.h>

inline void EnableMemLeakCheck()
{
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
}

using namespace std;

void test(double* X){
X[0]=1;
double* x=new double[300];
delete [] x;
}
int main()
{
EnableMemLeakCheck();
_CrtMemState s1, s2;
_CrtMemCheckpoint( &s1 );
_CrtMemDumpStatistics( &s1 );


double* xkoll=new double[3];

for (int ii = 0; ii<1000; ii++)
{
test(&xkoll[0]);
}

delete xkoll;

_CrtMemCheckpoint( &s2 );
_CrtMemDumpStatistics( &s2 );

system("pause");
return 0;
}


主函数中的变量xkoll和函数test中的变量X 我都做了delete。
可是我发现当当我多次调用函数test 后,内存报告中的Total allocations: 越来越大。
这属于内存泄漏吗?这是为什么呢?如何解决?


当ii 循环到 1
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
8338 bytes in 43 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 10762 bytes.
Total allocations: 16241 bytes.

当 ii循环到 1000
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
8338 bytes in 43 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 10762 bytes.
Total allocations: 2413841 bytes.


...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilmenau 2010-04-28
  • 打赏
  • 举报
回复
ok
谢谢大家。
明白了。
结贴。
hzy694358 2010-04-28
  • 打赏
  • 举报
回复
其实我觉得你可以看下开任务管理器,看看实际上内存的变化
Jimmy_Xia 2010-04-28
  • 打赏
  • 举报
回复
主函数中的变量xkoll和函数test中的变量X 我都做了delete。
可是我发现当当我多次调用函数test 后,内存报告中的Total allocations: 越来越大。
这属于内存泄漏吗?这是为什么呢?如何解决?
====================================
这个不属于内存泄漏,这个工具的Total allocations只是告诉你,你运行的程序总共分配了这么多内存。你的循环体中不断的new/delete,当然也属于你程序分配的内存了。
尹成 2010-04-28
  • 打赏
  • 举报
回复
释放的内存可能并不一定马上回收,还会占用,只有再使用的时候才会使用delete释放
hzy694358 2010-04-28
  • 打赏
  • 举报
回复
你程序运行的时候,当内存达到很高的时候,
你将程序最小化试试
看内存有没有降下来
ilmenau 2010-04-28
  • 打赏
  • 举报
回复
你的意思是说当程序跑到无内存可用的时候才释放那些delete的地方吗?
事实上我的程序本身就需要大快内存,如果是着样的话是不是不太好呢?怎样解决呢?
还是说着种结构就不好?(循环内反复new delete)
oyljerry 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ilmenau 的回复:]

问题表现为,当我在windows下用三指阐,查看内存使用情况时,发现在循环内内存使用持续增高。
[/Quote]
释放的内存可能并不一定马上回收,还会占用,只有再使用的时候才会使用delete释放的。
ilmenau 2010-04-28
  • 打赏
  • 举报
回复
问题表现为,当我在windows下用三指阐,查看内存使用情况时,发现在循环内内存使用持续增高。
ilmenau 2010-04-28
  • 打赏
  • 举报
回复
哦 谢谢,不过问题照旧,新的debug信息如下。

'test3.exe': Loaded 'D:\Eigene Dateien\Visual Studio 2008\test3\Debug\test3.exe', Symbols loaded.
'test3.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'test3.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
'test3.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll', Symbols loaded.
'test3.exe': Loaded 'C:\WINDOWS\system32\shimeng.dll'
'test3.exe': Unloaded 'C:\WINDOWS\system32\shimeng.dll'
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
8338 bytes in 43 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 8974 bytes.
Total allocations: 13817 bytes.

0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
8338 bytes in 43 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 10762 bytes.
Total allocations: 2413841 bytes.

'test3.exe': Loaded 'C:\WINDOWS\system32\apphelp.dll'
'test3.exe': Loaded 'C:\WINDOWS\system32\version.dll'
'test3.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll'
'test3.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll'
'test3.exe': Loaded 'C:\WINDOWS\system32\secur32.dll'
The program '[3216] test3.exe: Native' has exited with code 0 (0x0).
hzy694358 2010-04-28
  • 打赏
  • 举报
回复
delete xkoll;
--------------------
delete []xkoll;
redsunxin 2010-04-28
  • 打赏
  • 举报
回复
delete[] xkoll;

16,472

社区成员

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

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

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