c++ - 销毁具有指针值的映射的正确方法

2026-03-03 06:07:29

这会删除地图[...]中包含的指针吗?

不,鉴于您提供的代码,您将泄露地图的每个成员。

通常,对于每一个都new必须有一个匹配的delete. 您有一个delete用于地图的,但没有用于其中的元素。

解决这个问题最正确的方法是根本不使用动态分配。如果可能,只需存储MyTypes 目录:

map

...而不是动态分配map自身,而是自动存储:

map my_map;

如果由于某种原因无法自动存储持续时间,则使用智能指针进行动态分配。给定一个 C++11 编译器,使用unique_ptr(或者,很少,shared_ptr甚至weak_ptr)作为 中的元素map:

map> my_map;

(给定一个 C++03 编译器,使用它的 Boost 等价物。)然后当my_map被销毁时,所有元素都将是deleted。

排除所有这些,如果您处于上述任何一种情况都不适合您的情况(我非常怀疑),那么您将需要自己迭代地图:

struct deleter

{

template operator() (const T& rhs) const

{

delete rhs.second;

}

};

for_each (my_map->begin(), my_map->end(), deleter());

在 C++11 中,这可以做成一个 lambda,类似于:

for_each (my_map->begin(), my_map->end(), [](auto item) -> void

{

delete item.second;

});