C++ 使用std::list中的类型字符指针检测到内存泄漏

C++ 使用std::list中的类型字符指针检测到内存泄漏,c++,memory-leaks,C++,Memory Leaks,为什么我在没有分配或添加任何元素的情况下得到内存泄漏错误。我应该忽略它吗 #define CRTDBG_MAP_ALLOC #include <crtdbg.h> #include <list> using std::list; int main() { list <char*> roots; _CrtDumpMemoryLeaks(); } #定义CRTDBG_映射_分配 #包括 #包括 使用std::list; int main()

为什么我在没有分配或添加任何元素的情况下得到内存泄漏错误。我应该忽略它吗

#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <list>
using std::list;

int main()
{
    list <char*> roots;

    _CrtDumpMemoryLeaks();
}
#定义CRTDBG_映射_分配
#包括
#包括
使用std::list;
int main()
{
列出根;
_CrtDumpMemoryLeaks();
}

<代码> > p>如果你做C++,那么使用STD::String代替CHAR *可能是一个更好的实践。 无论如何,您必须理解,容器包含指向字符的指针,而不是字符本身。因此,在销毁时,它将释放指针占用的内存,但不会释放指针占用的内存


简而言之,在清除或清除列表之前,你应该释放每个字符。

< P>如果你做C++,那么使用STD::String代替CHAR *可能是一个更好的实践。 无论如何,您必须理解,容器包含指向字符的指针,而不是字符本身。因此,在销毁时,它将释放指针占用的内存,但不会释放指针占用的内存


简而言之,在销毁/清除列表之前,您需要释放每个字符*。

当您调用
\u CrtDumpMemoryLeaks
时,
列表还没有被销毁,因此它执行的任何分配都被视为内存泄漏。这与
字符*
无关:同样的事情也会发生在
列表中


\u CrtDumpMemoryLeaks
只报告尚未释放的任何分配。它无法知道
列表
析构函数尚未运行并执行释放。

调用
列表
尚未被销毁,因此它执行的任何分配都被视为内存泄漏。这与
字符*
无关:同样的事情也会发生在
列表中


\u CrtDumpMemoryLeaks
只报告尚未释放的任何分配。它无法知道
列表
析构函数尚未运行并执行释放。

在检查内存泄漏之前,您没有给
变量一个销毁的机会。如果先销毁
根目录
,您应该注意到所有内容都已清理。试试这个

#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <list>
using std::list;

int main()
{
    {
        list <char*> roots;
    }

    _CrtDumpMemoryLeaks();
}
#定义CRTDBG_映射_分配
#包括
#包括
使用std::list;
int main()
{
{
列出根;
}
_CrtDumpMemoryLeaks();
}

在检查内存泄漏之前,您没有给
根变量一个被销毁的机会。如果先销毁
根目录
,您应该注意到所有内容都已清理。试试这个

#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <list>
using std::list;

int main()
{
    {
        list <char*> roots;
    }

    _CrtDumpMemoryLeaks();
}
#定义CRTDBG_映射_分配
#包括
#包括
使用std::list;
int main()
{
{
列出根;
}
_CrtDumpMemoryLeaks();
}

一般来说,这样做更好

\u CRTSETDBG标志(\u CRTDBG\u泄漏\u检查\u DF)(您可能还需要其他标志…)


这会导致运行时在退出之前转储内存泄漏,而不是显式调用_crtdumpmomeryleaks。如果这样做,您可以确保仍然在作用域中的任何局部变量以及任何全局变量都将被释放,因此任何报告的内存泄漏都是“真实的”。

通常最好这样做

\u CRTSETDBG标志(\u CRTDBG\u泄漏\u检查\u DF)(您可能还需要其他标志…)


这会导致运行时在退出之前转储内存泄漏,而不是显式调用_crtdumpmomeryleaks。如果这样做,您可以确保仍然在作用域中的任何局部变量以及任何全局变量都将被释放,因此任何报告的内存泄漏都是“真实的”。

一个明显的解决方案是使用std::string而不是char*。哦,你确定std::list是正确的容器吗?向量或deque很可能是更好的选择。我不喜欢在将数据写入文件时使用std::string,我发现直接将std::string读取/写入文件的速度要慢得多。那么您就做错了。一个明显的解决方案是使用std::string而不是char*。哦,你确定std::list是正确的容器吗?向量或deque很可能是更好的选择。我不喜欢在将数据写入文件时使用std::string,我发现直接将std::string读取/写入文件的速度要慢得多。那么您就做错了。