我有一个定义如下的列表:
std::list<int *> m_ilist;
我将int
添加到列表中:
m_ilist.push_back (new int (x));
我想破坏向量并删除为每个元素分配的内存。
哪一个更好:
在列表中循环,在每个迭代器上调用delete。在此之后调用clear():
for (...) { delete *it; } m_ilist.clear ();
执行循环但在迭代器上调用erase:
for (...) { delete *it; m_ilist.erase (); }
更好将被定义为更快/更快/更少处理。
感谢。
答案 0 :(得分:1)
基准测试。更重要的是,在您的特定应用程序中对其进行基准测试。我们没有必要测试两个版本的合成运行时间,当你的里程 会有所不同时,这取决于你之后做的事情。
瓶颈是窗帘后面的令人讨厌的自由和摩托车。根据程序的其余部分显示的内存分配模式,您很可能会得到不同的结果。
说完了;差异很可能是微不足道的,所以我的直觉说第二个,如果有疑问则保存一个循环。
修改:请注意,如果您真的关心速度,请使用std::vector<int>
代替std::list<int*>
。差异将远大于您列出的选项之间的差异。
编辑2:如果您使用std::vector
,请务必使用变体1(使用clear
代替许多erase
)。在这种情况下, 会产生巨大的差异。如果元素非常大(与int
相反),您可能希望实际将指针(或智能指针)放入向量中以最小化复制开销。
答案 1 :(得分:1)
最快的方法是根本不删除它。这可能是一个奇怪的答案,但有一些方法可以不删除它,但仍然没有内存泄漏。
您可以尝试汇总整数。不是分配和取消分配整数,而是创建一个整数池。这样可以省去一次又一次地分配和释放内存,但代价是进行自己的管理(整数已经在使用,而不是这样)。这种管理的复杂程度取决于具体情况。在某些情况下,只需逐个分发整数就足够了,并在最后删除所有整数。看看这个技巧在你的情况下是否有帮助。
您也可以尝试不清理主线程中的列表,但是在单独的线程中。在应用程序的开头启动一个“清理线程”,当需要清理列表时,将列表传递给另一个线程(使用事件,关键部分和队列将列表从主线程传递到清理现在,清理线程可以清理列表并释放内存,同时主线程继续运行,执行重要的事情。
最后,运用你的想象力。