C++ 删除为列表分配的内存
看看下面的代码。在这段代码开始执行时,内存使用量是1020K。但在执行结束时,内存使用量为1144K。有人能帮我找出内存泄漏吗。如果调用了五次C++ 删除为列表分配的内存,c++,list,memory,delete-operator,C++,List,Memory,Delete Operator,看看下面的代码。在这段代码开始执行时,内存使用量是1020K。但在执行结束时,内存使用量为1144K。有人能帮我找出内存泄漏吗。如果调用了五次func(),内存使用率将达到1500K+。如果不使用该列表,内存使用不会增加 void func(); int _tmain(int argc, _TCHAR* argv[]) { func(); return 0; } void func() { list<char*> list1; list<ch
func()
,内存使用率将达到1500K+。如果不使用该列表,内存使用不会增加
void func();
int _tmain(int argc, _TCHAR* argv[])
{
func();
return 0;
}
void func()
{
list<char*> list1;
list<char*>::iterator iter;
char* val;
for(int i=0; i<100000; i++)
{
val = new char[20];
for(int j=0; j<20;j++)
{
val[j] = 'A';
}
val[19] = '\0';
list1.push_back(val);
}
iter = list1.begin();
for(int k=0; k<100000;k++, iter++)
{
delete[] *iter;
*iter = NULL;
}
val = NULL;
list1.clear();
list1.empty();
}
void func();
int _tmain(int argc,_TCHAR*argv[]
{
func();
返回0;
}
void func()
{
清单1;
迭代器iter;
char*val;
对于(inti=0;i我在这里没有看到内存泄漏,但我确实看到了很多非常糟糕的代码
我在您的代码中看到一些提示,您正在Windows下运行,当我凝视我的水晶球时,我想我看到您正在检查任务管理器以检测内存泄漏。使用任务管理器检测内存泄漏就像使用大刀做手术。TM可能会给您提示,系统中可能存在大量内存泄漏em,但它离您的程序太远,太粗糙,无法确定。您需要使用专用于该作业的工具,而不是使用TM来确定是否存在内存泄漏。Visual Studio内置
当我在您的代码中使用这些内置设施时:
#include <cstdlib>
#include <list>
using std::list;
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
void func();
int main(int argc, char* argv[])
{
func();
return 0;
}
void func()
{
list<char*> list1;
list<char*>::iterator iter;
char* val;
for(int i=0; i<100000; i++)
{
val = new char[20];
for(int j=0; j<20;j++)
{
val[j] = 'A';
}
val[19] = '\0';
list1.push_back(val);
}
iter = list1.begin();
for(int k=0; k<100000;k++, iter++)
{
delete[] *iter;
*iter = NULL;
}
val = NULL;
list1.clear();
list1.empty();
_CrtDumpMemoryLeaks();
}
对generate\n
的调用使用C++11 lambda,但可以很容易地进行重构以完全使用函子或其他东西。我在这里没有看到内存泄漏,但我确实看到很多非常糟糕的代码
我在您的代码中看到一些提示,您正在Windows下运行,当我凝视我的水晶球时,我想我看到您正在检查任务管理器以检测内存泄漏。使用任务管理器检测内存泄漏就像使用大刀做手术。TM可能会给您提示,系统中可能存在大量内存泄漏em,但它离您的程序太远,太粗糙,无法确定。您需要使用专用于该作业的工具,而不是使用TM来确定是否存在内存泄漏。Visual Studio内置
当我在您的代码中使用这些内置设施时:
#include <cstdlib>
#include <list>
using std::list;
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
void func();
int main(int argc, char* argv[])
{
func();
return 0;
}
void func()
{
list<char*> list1;
list<char*>::iterator iter;
char* val;
for(int i=0; i<100000; i++)
{
val = new char[20];
for(int j=0; j<20;j++)
{
val[j] = 'A';
}
val[19] = '\0';
list1.push_back(val);
}
iter = list1.begin();
for(int k=0; k<100000;k++, iter++)
{
delete[] *iter;
*iter = NULL;
}
val = NULL;
list1.clear();
list1.empty();
_CrtDumpMemoryLeaks();
}
对generate\n
的调用使用了C++11 lambda,但可以很容易地进行重构以完全使用函子或其他东西。\u tmain
可能应该只是main
,而TCHAR
可能只是char
。这不是Windows特有的问题,也没有提到Windows。使用std::list
而不是std::list
如何度量内存使用率?不要说你只是在任务管理器中查看内存使用率,并将其作为查找内存泄漏的一个重要度量。\u tmain
可能只是main
,而TCHAR
可能只是char
。这是这不是Windows特有的问题,也没有提到Windows。使用std::list
而不是std::list
如何测量内存使用率?不要说你只是在任务管理器中查看内存使用率,并将其视为查找内存泄漏的一项重要措施。顺便说一句,它只有19个'a'
s,否则很好是的,当然。顺便说一句,这只是19个a,当然,否则答案不错。
#include <string>
using std::string;
#include <algorithm>
using std::generate_n;
#include <iterator>
using std::back_inserter;
void func()
{
static const size_t NumStrings = 10000;
typedef list<string> strings;
// Populate the list
strings list2;
generate_n(back_inserter(list2), NumStrings, []() -> string
{
static const size_t NumChars = 19;
static const char InitChar = 'A';
return string(NumChars, InitChar);
});
// Clear the list
list2.clear();
// Done
_CrtDumpMemoryLeaks();
}