目前我一直对学校作业感兴趣,正在处理一些非常讨厌的内存泄漏问题。在调试时,我将问题的一部分缩减为一段代码。为什么此代码会产生内存泄漏?
这里是代码,我调整来说明泄漏的极度简化版本:
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
do {
char *name = new char;
char *cname = new char[10];
cin >> cname;
name = cname;
delete [] name;
} while(false);
_CrtDumpMemoryLeaks();
所以我的问题是,为什么这产生了内存泄漏?我试过一堆东西来解决它,但没有任何工作。
编辑:
嗯,看来我已经被误解的指针是如何运作的。出于某种原因,我假设指针初始化时没有指向NULL而不是内存块,因此不需要处理。
简单的问题可以得到简单的答案。谢谢。
'的char * name = nullptr'将指向没有记忆,但调用'new'分配内存(并因此需要被释放) – Tas
您分配一个字符,分配10个字符,做一些东西,删除10个字符,但不要删除单个字符(你实际上并不需要分配,但你做了)。 – immibis