gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:33:43 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com