如题
this 简介:
每个非静态的类成员函数默认参数都会压栈一个this,它指向的是调用改成员函数的对象, 也是就className的object
this 被隐含声明为 className* const this;
- 1.意味着不能改变this的指向
- 2.this是个右值,不能取地址 ,不能&this
那我们 在成员函数中 delete this 会发生什么?
class Test {
public:
void hello() {
delete this;
}
};
void main()
{
Test t11;
t11.hello();
}
蹦了 。。。。
咱们看一下cpp wiki上的说明
翻译一下
合法,但:
-
必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配的
-
必须保证调用 delete this 的成员函数是最后一个调用 this 的成员函数
-
必须保证成员函数的 delete this 后面没有调用 this 了 必须保证 delete this 后没有人使用了
ok 说了必须是new 出来的, 不能是在栈上的,咱们试试
Test* t12 = new Test();
t12->hello();
果真可以了
咱们在改造一下
class Test {
public:
void hello() {
delete this;
}
void doWork() {
std::cout << "do work";
}
void sayHi() {
++m_i;
}
void print() {
std::cout << "i:" << m_i;
}
private:
int m_i = 0;
};
加了一个成员变量 m_i
咱们在delete this 后,在调用其它的成员函数
Test* t12 = new Test();
t12->hello();
t12->doWork(); //ok
t12->sayHi(); //ok 但是m_i的值已经是乱的了
t12->print(); //ok. 但是m_i的值已经是乱的了
也就是说从delete this后, 内存已经回收了,这块区域对应的已经是不确定值了
,所以delete this, 任何成员别动了别调用了,