假设我有一个foo
课,其函数release
调用delete this
:
struct foo
{
std::int32_t release() const
{
delete this;
return 0;
}
};
为什么我可以调用delete this
,因为函数是const
?
是否定义了返回0的行为? delete
引用该标准的答案(因此我可以在我的代码中加上精彩的评论)将非常感激。
答案 0 :(得分:1)
为什么我甚至可以调用delete,因为函数是const
因为delete
不一定修改已删除的指针。
是否定义了返回0的行为?删除后不是“排序”功能吗?
为什么会这样?逻辑未从程序中删除。该功能保留在内存中,供下一个对象使用。它只有this
指针才会失效。
有一个SO answer指向The ISO C++ FAQ,其上有一个条目,摘录于:{/ p>
- 您必须绝对100%确定您的其他成员函数(在删除此行之后)不会触及此对象的任何部分(包括调用任何其他成员函数或触摸任何数据成员)。这包括将在析构函数中运行的代码,用于堆栈中分配的任何仍然存活的对象。
- 你必须绝对100%肯定在删除此行后没有人甚至触及此指针本身。换句话说,你不能检查它,将它与另一个指针进行比较,将它与nullptr进行比较,打印,投射,用它做任何事情。
醇>
由于你的代码遵守这些规则,再次,没关系。
答案 1 :(得分:1)
- 为什么我甚至可以调用delete,因为函数是const?
醇>
从标准中,5.3.5 $ 2删除[expr.delete]
[注意:指向const类型的指针可以是a的操作数 删除表达;没有必要抛弃常量 (5.2.11)之前的指针表达式用作操作数 delete-expression。 - 后注]
和
- 是否定义了返回0的行为?
醇>
我认为这很安全。 delete this;
将调用析构函数并释放对象的内存保留(包括成员变量和基类子对象)。之后,如果你没有拒绝this
,或访问任何成员变量,它将是安全的。