删除标准::映射中的新内存?



假设我有一个new的指针映射,我如何迭代该映射并干净地删除它们?以下是我尝试过的:

std::map<std::string, Foo*> foos;
foos.insert(std::make_pair("blah", new Foo()));
for (auto& f : foos) {
    delete f;
}

虽然它似乎不起作用,但我得到了以下错误。

$ g++ test.c -std=c++14
test.c: In function 'int main()':
test.c:12:12: error: type 'struct std::pair<const std::basic_string<char>, Foo*>' argument given to 'delete', expected pointer
     delete f;

std::map包含键值对。因此,当你进行时

for (auto& f : foos) {
    delete f;
}

f是一对,而不是存储在映射中的指针。你不能在该对上调用delete,因为你没有分配它。如果你想删除映射中的所有指针,那么你可以使用

for (auto& f : foos) {
    delete f.second;
}
foos.clear();

这将删除映射中的每个指针,然后clear()调用将清空映射,这样就不会有一个充满已删除指针的映射。

不过,我确实建议您尽可能使用纯值,如果不能,那么至少使用智能指针。它们将为您处理内存释放。

map元素是键和值的std::pair,因此在这种情况下,您应该删除其second字段:

std::map<std::string, Foo*> foos;
foos.insert("blah", new Foo());
for (auto& f : foos) {
    delete f.second;
}

最新更新