c++ - 从 map 中删除指向已删除对象的所有条目

标签 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;
}

输出:

Log A
Log A
Log A

我的问题:

  1. 删除 a 后调用 m[1]->Log() 不会抛出异常只是偶然吗?
  2. 删除映射中指向已删除的 A 实例的所有条目的最佳方法是什么?我的意思是我希望所有 m.find(1)m.find(2)m.find(3) 返回 m.end() 删除 a 之后。如有任何建议,我们将不胜感激。

最佳答案

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

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

关于c++ - 从 map 中删除指向已删除对象的所有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799160/

相关文章:

c++ - 将派生对象地址分配给基指针和调用析构函数的机制

c - 如何正确使用从函数接收的指针? (在 C 中)

将一个 char** 复制到另一个 char** (C)

perl - 使用map提取匹配指定值的(key, value)哈希集

c++ - 我应该选择哪个 C++ 信号/插槽库?

c++ - 使用 std::find_if 和 std::vector 查找大于某个值的最小元素

c++ - 如何在 C++ API 中使用 NDArray?

c - 我如何处理指针?

Scala map 转换

Java - 为什么 Map.put() 覆盖而 Set.add() 不覆盖?