[英]What do you call a member function that follows a member function and how do I write one?
[英]what will happen if you do “delete this;” in a member function?
如果成员 function 尝试delete this;
,比如在下面的class的构造函数中?
class A
{
public:
A(int);
~A();
int *pi;
}
A::A(int i)
{
delete this;
pi = new int(i);
}
A::~A()
{
delete pi;
}
这个C++ FAQ 条目很好地回答了这个问题,在这里重复:
只要你小心,object delete this
.
以下是我对“小心”的定义:
delete this
后访问pi
违反了#3
坏事。 你可以delete this;
但这通常是一个非常糟糕的主意,一旦完成,您就无法触摸任何成员变量或成员函数。
一般来说,从成员 function 内部调用delete this
是明确定义的,如果有一点风险的话。
但是从构造函数调用它可能是一个非常糟糕的主意(我不知道它是否定义明确)。 为什么你会想要那样做?
您可以delete this
,但这假定该实例是使用new
创建的,并且您不再访问该实例的任何成员。
在您的示例中,如果您这样做,几乎会发生相同的情况
class A
{
public:
A(int);
int *pi;
};
A::A(int i)
{
pi = new int(i);
}
int main()
{
A* p = new A(10);
delete p;
p->pi = new int; //bad stuff
//or
A a(20);
delete &a; //bad stuff
a.pi = new int; //more bad stuff
}
更糟糕的事情发生了,因为当你delete this
时, pi
成员被统一化,导致析构函数试图删除一个悬空指针。
1) delete 运算符仅适用于使用 new 运算符分配的对象。 如果 object 是使用 new 创建的,那么我们可以删除它,否则行为未定义。
class A {
public:
void fun(){
delete this;
}
};
int main(){
/* Following is Valid */
A *ptr = new A;
ptr->fun();
ptr = NULL // make ptr NULL to make sure that things are not accessed using ptr.
/* And following is Invalid: Undefined Behavior */
A a;
a.fun();
return 0;
}
2)一旦删除完成,删除后object的任何成员都不应访问。
class A {
int x;
public:
A() { x = 0;}
void fun() {
delete this;
/* Invalid: Undefined Behavior */
cout<<x;
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.