【问题标题】:C++ deleting pointers in a mapC ++删除地图中的指针
【发布时间】: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


【解决方案1】:

您应该在循环中使用对值类型元素的引用,而不是使用副本。例如

for ( pair<const string,Plaats*> &place : plaatsen){
    //Plaats *p = place.second;
    delete place.second;
    place.second = nullptr;
}

还要考虑到密钥应该有限定符 const pair&lt;const string,Plaats*&gt;

【讨论】:

    【解决方案2】:

    您需要使用引用来避免复制。

    for(pair<string,Plaats*>& place : plaatsen){
    

    编辑:我在上面的答案中错过了const。所以弗拉德的答案更好。罗宾逊对我的回答的评论是一个更好的答案。

    【讨论】:

    • 给出以下错误:(: g++ -std=c++11 -g -c kortstepad.cpp kortstepad.cpp: 在析构函数'KortstePad::~KortstePad()': kortstepad.cpp: 19:36:错误:从 'std::pair, KortstePad::Plaats*>' for(pair& place : plaatsen){
    • 我更喜欢 for(auto & place : plaatsen),因为它打字少:)。
    • 感谢您的提示 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多