【发布时间】:2016-02-01 09:34:52
【问题描述】:
使用映射中的指针删除堆项
我有这张地图:
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?
【问题讨论】:
-
为什么不使用智能指针?
-
delete不会改变它所应用的任何表达式的内容,只会破坏该表达式指向的对象。您似乎知道这一点,因为您将place.second明确设置为null,但您仍在询问与delete相关的内容。不,您只是无法在循环中设置值,仅此而已!
标签: c++ c++11 pointers heap-memory