C++ 删除为列表分配的内存

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

看看下面的代码。在这段代码开始执行时,内存使用量是1020K。但在执行结束时,内存使用量为1144K。有人能帮我找出内存泄漏吗。如果调用了五次
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();
}