所以这是我正在处理的代码:
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
我的问题:
删除 a
后调用m[1]->Log()
不会抛出异常只是偶然吗?- 删除映射中指向已删除的
A
实例的所有条目的最佳方法是什么?我的意思是我希望所有m.find(1)
、m.find(2)
和m.find(3)
返回m.end()
删除a
之后。如有任何建议,我们将不胜感激。
最佳答案
是也不是。从技术上讲,这是未定义的行为,但通常(不要依赖于此)调用不访问成员的非虚拟方法似乎适用于大多数编译器,因为大多数编译器实现this 调用而不取消引用
this
(这是无效的部分)。所以,在标准看来,这是偶然的。对于大多数编译器来说,这是有意的(或者至少是函数调用处理方式的副作用)。改用智能指针。要删除元素,您可以遍历 map 并将每个值与您的值进行比较。当你到达一个时,使用
erase
。迭代器在删除后失效。
关于c++ - 从 map 中删除指向已删除对象的所有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799160/