函数中' delete this '的行为
Behaviour of `delete this` in a function
假设我有一个类foo
,其函数release
调用delete this
:
struct foo
{
std::int32_t release() const
{
delete this;
return 0;
}
};
既然函数是
const
,为什么还可以调用delete this
呢?返回0时的行为是否已定义?函数"sort-of-die"是不是在
delete
之后?
一个参考标准的答案(这样我就可以在我的代码中添加一个花哨的注释)将不胜感激。
- 为什么我甚至可以调用delete this函数是const?
从标准,5.3.5$2 Delete [expr.delete]
[注:指向const类型的指针可以是a的操作数delete-expression;没有必要抛弃这种不变(5.2.11)在将指针表达式用作操作数之前对其进行操作delete-expression。-end note]
和
- 返回0时的行为是否已定义?
我认为它是安全的。delete this;
将调用析构函数并释放对象(包括成员变量和基类子对象)持有的内存。在此之后,如果您不解引用this
,或访问任何成员变量,它将是安全的。
既然函数是const
,为什么还要调用delete this呢?
因为delete
不一定会修改被删除的指针。
返回0的行为是否已定义?在删除之后,函数不是"有点死"了吗?
为什么呢?逻辑并没有从程序中移除。该功能保留在内存中,以供下一个对象使用。只有this
指针失效。
有一个SO答案指向ISO c++常见问题解答,其中有一个条目,其中的摘录:
- 你必须绝对100%地肯定你的成员函数的其余部分(删除这一行之后)不会触及这个对象的任何部分(包括调用任何其他成员函数或触及任何数据成员)。这包括将在析构函数中运行的代码,这些析构函数用于堆栈上分配的任何仍然存活的对象。
- 你必须绝对100%肯定地确保在删除这一行之后没有人碰过this指针本身。换句话说,你不能检查它,不能和另一个指针比较,不能和nullptr比较,不能打印它,不能强制转换它,不能对它做任何操作。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- C++调用具有 *this 属性的单个帮助程序函数
- Doees the 'this' 指针参与虚函数的多态行为
- 析构函数中的"delete this"
- 为什么成员函数内的"this"指针为空?
- 为什么我需要在转换构造函数上引用 this->?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- 在 C++ 中返回新的构造函数(*this)工厂
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 使用 std::function 作为成员函数,它捕获"this",并在析构函数之后从复制的 lam
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- 从自身内部替换 std::函数(通过将移动赋值到 *this?)
- 使用 boost::序列化代码将 *this 传递给模板函数会产生错误
- c++:成员函数中的"this == nullptr"安全吗?
- 带有 "this" 关键字的 Java Copy 构造函数
- 返回C++"This"对象的函数