这会删除地图[...]中包含的指针吗?
不,鉴于您提供的代码,您将泄露地图的每个成员。
通常,对于每一个都new
必须有一个匹配的delete
. 您有一个delete
用于地图的,但没有用于其中的元素。
解决这个问题最正确的方法是根本不使用动态分配。如果可能,只需存储MyType
s 目录:
map<string, MyType>
...而不是动态分配map
自身,而是自动存储:
map<string,MyType> my_map;
如果由于某种原因无法自动存储持续时间,则使用智能指针进行动态分配。给定一个 C++11 编译器,使用unique_ptr
(或者,很少,shared_ptr
甚至weak_ptr
)作为 中的元素map
:
map<string, unique_ptr<MyType>> my_map;
(给定一个 C++03 编译器,使用它的 Boost 等价物。)然后当my_map
被销毁时,所有元素都将是delete
d。
排除所有这些,如果您处于上述任何一种情况都不适合您的情况(我非常怀疑),那么您将需要自己迭代地图:
struct deleter
{
template <typename T> 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;
});