迭代器会导致内存泄漏吗?

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 容易泄漏,则可能。为什么你怀疑它会泄漏?了解这将有助于我们回答您的问题。 内存泄漏来自未正确回收的分配。你在这里分配什么?你能在调试器中单步调试并了解更多信息吗? 迭代器,作为一个概念,没有内存泄漏风险。虽然不知道一个足够差的实现会出现什么问题。 内存泄漏的唯一潜在来源是FolderFile 类型不释放它们的资源 @JakeYoung “所有堆块都被释放了——不可能有泄漏”,不是吗? 【参考方案1】:

不,您不必deletelist&lt;Folder&gt;::iterator itr,因为它是具有自动存储持续时间的变量,不是指针。

请记住,您只能将使用new 获得的指针提供给delete,并将使用new[] 获得的指针提供给delete[]

【讨论】:

【参考方案2】:

如果我不删除 *itr 会导致内存泄漏吗?

不,不会的。

std::list::erase 将确保调用包含在该位置的对象的析构函数,在您的情况下为 File 对象。

【讨论】:

以上是关于迭代器会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

存储过程会导致内存泄漏吗?

这个 JavaScript 代码会导致内存泄漏吗?

预定的未来会导致内存泄漏吗?

JavaScript setInterval() 方法会导致内存泄漏吗?

自动释放的 NSArray 会导致内存泄漏吗?

在 Handler 线程的队列中添加匿名可运行对象会导致内存泄漏吗?