C ++ map :: erase()不会删除数据

时间:2016-02-26 17:05:15

标签: c++ dictionary erase

我正在尝试使用以下代码测试C ++ map::erase()

//file user.h
#include <string>
#include <fstream>
#include <cstring>

using namespace std;

class User {
    string name;
    int id;
public:
    User(const string& name, int id) : name(name), id(id) {}
    int getID() const {return id;}
    ~User(){}
};

//file main.cpp
#include "user.h"
using namespace std;

typedef map<string, User*> Dict;

int main()
{
    Dict dict;
    dict["Smith"] = new User("Smith", 666); //Id = 666
    dict["Adams"] = new User("Adams", 314); //Id = 314


    auto it = dict.find("Adams"); //look for user 'Adams'

    if (it == dict.end())         

    //show 'not Found' if didn't find 'Adams'
    cout << "not Found" << endl; 

    else
    //else, show the Id = 314
    cout << "id1: " << it->second->getID() << endl;


    //Here I think there is a problem
    //I ask to delete Adams from the list
    dict.erase(it);
    //So in this print the ID shouldn't be found
    cout << "id2: " << it->second->getID() << endl;

    return 0;
}

尝试从列表中删除项目后,似乎没有删除该项目,因为程序显示以下内容:

pc@pc:~/Test$ ./main
id1: 314
id2: 314

据我所知,id2不应显示任何价值。这是好还是我误解了erase的使用。如果是,如何在项目显示后删除该项目?

3 个答案:

答案 0 :(得分:4)

你处于未定义的行为之地。修改映射后,您正在使用迭代器(it)。任何事情都可能发生 - 包括显然有效(有点)。你应该重做

v_2

这将找不到任何东西

答案 1 :(得分:3)

基本上你有未定义的行为调用

dict.erase(it);
//So in this print the ID shouldn't be found
cout << "id2: " << it->second->getID() << endl;

dict.erase(it);一起使用时,迭代器变量不以某种方式重置

在使用delete之前,您还应该注意致电erase()。否则你会泄漏内存。

答案 2 :(得分:-2)

您正在从地图中删除指针,但地图指向的对象未被删除。您需要花一些时间在c ++中学习内存管理。