迭代器会导致内存泄漏吗?
Posted
技术标签:
【中文标题】迭代器会导致内存泄漏吗?【英文标题】:Will an iterator cause a memory leak? 【发布时间】:2018-09-10 17:29:59 【问题描述】:如果我不删除 *itr 会导致内存泄漏吗?我只是想知道一个项目,不想扣分。
void Directory::removeFile(string fName)
// Get files from directory
list<Folder> folders = this->getFolders();
list<File> files = this->getFiles();
for (list<Folder>::iterator itr = folders.begin(); itr != folders.end(); ++itr)
if (fName == (*itr).getFolderName())
cout << fName << ": Is a directory." << endl;
return;
for (list<File>::iterator itr = files.begin(); itr != files.end(); ++itr)
if (fName == (*itr).getFileName())
cout << "Found it" << endl;
itr = files.erase(itr);
this->setFiles(files);
return;
cout << "This file does not exist." << endl;
编辑:我问这个的原因是因为我做了 valgrind 并得到了这个结果。这是内存泄漏吗?
HEAP SUMMARY:
==27219== in use at exit: 0 bytes in 0 blocks
==27219== total heap usage: 25 allocs, 25 frees, 82,671 bytes allocated
==27219==
==27219== All heap blocks were freed -- no leaks are possible
==27219==
==27219== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==27219== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
【问题讨论】:
我没有看到new
甚至是指针,所以可能没有。但如果File
容易泄漏,则可能。为什么你怀疑它会泄漏?了解这将有助于我们回答您的问题。
内存泄漏来自未正确回收的分配。你在这里分配什么?你能在调试器中单步调试并了解更多信息吗?
迭代器,作为一个概念,没有内存泄漏风险。虽然不知道一个足够差的实现会出现什么问题。
内存泄漏的唯一潜在来源是Folder
和File
类型不释放它们的资源
@JakeYoung “所有堆块都被释放了——不可能有泄漏”,不是吗?
【参考方案1】:
不,您不必delete
和list<Folder>::iterator itr
,因为它是具有自动存储持续时间的变量,不是指针。
请记住,您只能将使用new
获得的指针提供给delete
,并将使用new[]
获得的指针提供给delete[]
。
【讨论】:
【参考方案2】:如果我不删除 *itr 会导致内存泄漏吗?
不,不会的。
std::list::erase
将确保调用包含在该位置的对象的析构函数,在您的情况下为 File
对象。
【讨论】:
以上是关于迭代器会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章