从地图中删除指向已删除对象的所有条目

Mey*_*sam 2 c++ pointers map

所以这是我正在处理的代码:

class A
{
public:
    A(){}
    virtual ~A(){}
    void Log(){printf("Log A\n");}
};

int main(int argc, char**argv) 
{
    A* a = new A();

    a->Log(); // "Log A"

    map<int,A*> m;
    m[1] = a;
    m[2] = a;
    m[3] = a;

    m[1]->Log(); // "Log A"

    delete a;
    a = NULL;

    m[1]->Log(); // "Log A"

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

记录
日志A
日志A.

我的问题:

  1. 只是偶然的召唤m[1]->Log()之后不会抛出异常delete a吗?
  2. 擦除地图中指向已删除实例的所有条目的最佳方法是A什么?我的意思是我想要所有m.find(1),m.find(2)并在删除后m.find(3)返回.任何意见,将不胜感激.m.end()a

Luc*_*ore 5

  1. 是的,不是.从技术上讲,它是未定义的行为,但通常(不依赖于此)调用不访问成员的非虚方法似乎适用于大多数编译器,因为大多数编译器实现此调用而不解除引用this(这是无效部分).所以,在标准看来,这是偶然的.对于大多数编译器来说,它是预期的(或者至少是如何处理函数调用的副作用).

  2. 请改用智能指针.要删除元素,您可以遍历地图并将每个值与您的值进行比较.当你到达一个,使用erase.擦除后迭代器无效.