C++删除映射中的指针

C++ deleting pointers in a map

本文关键字:指针 映射 删除 C++      更新时间:2023-10-16

删除映射中带有指针的堆项

我有这张地图:

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对我的回答做出了更好的回答。