如何正确删除指针映射作为键?
How to properly delete a map of pointers as key?
我有一张 key/value 指针的映射:
std::map<A*, B*> myMap;
仅释放密钥内存的正确方法是什么?
我正在考虑这样做:
for (auto itr = _myMap.begin(); itr != _myMap.end(); itr++)
{
if (certainCondition == true)
{
delete itr->first;
itr->first = nullptr;
}
}
这样做正确吗?我的地图是否会保留 nullptr
作为键,并且未来的迭代将包含 nullptr
?
关键是常量。你不应该能够改变它。
http://www.cplusplus.com/reference/map/map/
您不能修改容器的键,因为它用于定义排序,就地更改它可能会使排序无效。此外,每个键都必须是唯一的。因此,您需要将项目从地图中移除,然后清理内存。
如果您已经有密钥:
myMap.erase(key);
delete key;
如果地图中已有迭代器:
A* keyCopy = itr->first;
myMap.erase(itr);
delete keyCopy;
编辑
根据您更新的问题:
auto itr = myMap.begin();
while (itr != myMap.end())
{
if (certainCondition == true)
{
A* keyCopy = itr->first;
itr = myMap.erase(itr);
delete keyCopy;
}
else
{
++itr;
}
}
erase() 映射中的元素,然后删除用作键的指针(如果有必要,在擦除之前缓存指针,如果它在其他任何地方都不存在)
一个映射中的每个唯一键只能出现一次。即使有可能——如果您想 nullptr 出多个元素的键,会发生什么情况?没什么用!
我有一张 key/value 指针的映射:
std::map<A*, B*> myMap;
仅释放密钥内存的正确方法是什么?
我正在考虑这样做:
for (auto itr = _myMap.begin(); itr != _myMap.end(); itr++)
{
if (certainCondition == true)
{
delete itr->first;
itr->first = nullptr;
}
}
这样做正确吗?我的地图是否会保留 nullptr
作为键,并且未来的迭代将包含 nullptr
?
关键是常量。你不应该能够改变它。 http://www.cplusplus.com/reference/map/map/
您不能修改容器的键,因为它用于定义排序,就地更改它可能会使排序无效。此外,每个键都必须是唯一的。因此,您需要将项目从地图中移除,然后清理内存。
如果您已经有密钥:
myMap.erase(key);
delete key;
如果地图中已有迭代器:
A* keyCopy = itr->first;
myMap.erase(itr);
delete keyCopy;
编辑
根据您更新的问题:
auto itr = myMap.begin();
while (itr != myMap.end())
{
if (certainCondition == true)
{
A* keyCopy = itr->first;
itr = myMap.erase(itr);
delete keyCopy;
}
else
{
++itr;
}
}
erase() 映射中的元素,然后删除用作键的指针(如果有必要,在擦除之前缓存指针,如果它在其他任何地方都不存在)
一个映射中的每个唯一键只能出现一次。即使有可能——如果您想 nullptr 出多个元素的键,会发生什么情况?没什么用!