C++删除映射中的指针
C++ deleting pointers in a map
删除映射中带有指针的堆项
我有这张地图:
map<string, Plaats*> plaatsen;
在一个函数中,我将像这样向地图添加位置:
Plaats * fromPlace = new Plaats(from);
Plaats * toPlace = new Plaats(to);
auto insertedFrom = plaatsen.insert(pair<string,Plaats*>(from,fromPlace));
auto insertedTo = plaatsen.insert(pair<string,Plaats*>(to,toPlace));
//delete from or to if they are not inserted
if(!insertedFrom.second){
delete fromPlace;
}
if(!insertedTo.second){
delete toPlace;
}
如果元素被添加到我的映射中,我需要在析构函数中删除它。
KortstePad::~KortstePad(){
//delete every item in plaatsen
for(pair<string,Plaats*> place : plaatsen){
//Plaats *p = place.second;
delete place.second;
place.second = nullptr;
}
for(pair<string,Plaats*> place : plaatsen){
Plaats *p = place.second;
cout << (p == nullptr) << endl;
}
}
我的代码似乎没有删除我的位置,因为这是程序的输出:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
为什么这段代码没有将我的指针设置为nullptr?我是否将局部变量设置为nullptr?
您应该在循环中使用对值类型元素的引用,而不是使用副本。例如
for ( pair<const string,Plaats*> &place : plaatsen){
//Plaats *p = place.second;
delete place.second;
place.second = nullptr;
}
还应考虑密钥应具有限定符constpair<const string,Plaats*>
。
您需要使用引用来避免复制。
for(pair<string,Plaats*>& place : plaatsen){
编辑:我在上面的答案中漏掉了一个const
。所以弗拉德的答案更好。Robinson对我的回答做出了更好的回答。
相关文章:
- 如何创建对象函数指针C++映射?
- c++:复制、删除和运算符=在原始指针映射中
- 尝试通过指针映射访问类成员
- 使用函数指针映射时的 C++ 调用函数
- 将新元素推送到函数指针映射中 "inline" ?
- 如何在C 11中创建指针映射以静态成员功能
- 方法指针映射,编译器说他们不接受任何参数
- 从指针映射调用函数,指向具有可变数量参数的函数
- 如何使用boost::与函数指针映射正确绑定
- std::按值或指针映射操作
- 将函数指针映射到 std::string
- 指向指针向量的指针映射的错误
- 使用C++中的函数指针映射枚举键和值
- 创建指向成员函数的指针映射
- 无法从指向多态类的指针映射获取有效的指针
- C++ - 通过 getter 函数在单独的类中从对象指针映射访问成员函数
- 指向成员函数的指针映射:无法将 void (*) 转换为 void (对象::*)
- std::基类指针映射
- 为对象指针映射编写函数模板时出现问题
- 指针映射的数组下标运算符