c ++返回已删除对象的方法
c++ returning into method of deleted object
这是 delete this
辩论的变体,与 中间 方法调用发生的情况有关。
基本上,如果方法 A 调用方法 B,并且方法 B 销毁了对象,那么当从 B 返回时,方法 A 内部会发生什么特别的事情吗?像这样:
struct test {
void A() {
B();
// what happens here besides being unable to dereference `this` anymore?
}
void B() {delete this;}
};
是否可以假设,只要不再与前一个对象的内存位置进行任何交互,返回到过期对象的方法就会正常进行?
可以满足:
对象必须是用 new
创建的。 (请注意,放置 new
之后的 delete
是不行的)。
调用delete this;
后不要调用任何成员函数或访问成员数据(因堆栈展开而重新进入的函数可以)。
不要尝试将指针类型分配给 this
。
因此,就您而言,没有问题(假设您符合 1)。
不会有什么不好的事情发生。当然还有明显的需要注意的地方 like:
- 确保
this
指向的对象是用 new
分配的。
- 在
B()
之后不要调用任何其他成员函数并且在B()
之后不要访问任何成员变量。
- 不要对
B()
之后的任何内容使用 this
,不,甚至指针本身也不行。
这是 delete this
辩论的变体,与 中间 方法调用发生的情况有关。
基本上,如果方法 A 调用方法 B,并且方法 B 销毁了对象,那么当从 B 返回时,方法 A 内部会发生什么特别的事情吗?像这样:
struct test {
void A() {
B();
// what happens here besides being unable to dereference `this` anymore?
}
void B() {delete this;}
};
是否可以假设,只要不再与前一个对象的内存位置进行任何交互,返回到过期对象的方法就会正常进行?
可以满足:
对象必须是用
new
创建的。 (请注意,放置new
之后的delete
是不行的)。调用
delete this;
后不要调用任何成员函数或访问成员数据(因堆栈展开而重新进入的函数可以)。不要尝试将指针类型分配给
this
。
因此,就您而言,没有问题(假设您符合 1)。
不会有什么不好的事情发生。当然还有明显的需要注意的地方 like:
- 确保
this
指向的对象是用new
分配的。 - 在
B()
之后不要调用任何其他成员函数并且在B()
之后不要访问任何成员变量。 - 不要对
B()
之后的任何内容使用this
,不,甚至指针本身也不行。