首页 > 试题广场 >

如果有一个类是 myClass , 关于下面代码正确描述的是

[单选题]
如果有一个类是 myClass , 关于下面代码正确描述的是:
myClass::~myClass(){
delete this;
this = NULL;
}
  • 正确,我们避免了内存泄漏
  • 它会导致栈溢出
  • 无法编译通过
  • 这是不正确的,它没有释放任何成员变量。
推荐

此处代码可以看出this指针内容为const,不允许进行修改,故编译不成功。
~MyClass() { delete this;  }
如果为此句代码,则能通过编译,不过会导致栈溢出,因为不断的调用析构函数。

我就是愚蠢的选择了栈溢出。。。忽略了this=NULL;
编辑于 2016-05-19 12:04:00 回复(13)
编译不通过主要是语句 this=NULL; 
因为类的构造函数中,this 指针的形式为Myclass *const this; 它是一个常量指针,指针的指向不能修改。
发表于 2016-05-23 14:33:03 回复(16)
delete 的过程实际是先调用析构函数,然后释放内存
在析构函数内调用delete 会造成递归调用,
发表于 2015-10-03 20:07:27 回复(2)
1.在类A的析构函数中,delete一个非A类对象通常是没有问题的; 
在类A的析构函数中,delete一个类A的对象,就会造成死循环,堆栈溢出;
在析构函数外使用 delete后,应该立即给指针赋值 NULL防止野指针。

2.因为this是Myclass * const this指针,也就是说this指针指向的对象(不是指向的对象的值)不可以改变,所以给this赋值在编译期间就不会通过,
如果没有this = NULL这语句的话是栈溢出,因为会不停的调用析构函数。

3.this被const修饰不能修改。 删掉this=null后,在类的析构函数中调用delete this,delete this会去调用本对象的析构函数,而析构函数中又调用delete this,形成无限递归,造成堆栈溢出,系统崩溃。
发表于 2017-09-15 17:05:26 回复(0)
无法编译通过。
1.在类A的析构函数中,delete一个非A类对象通常是没有问题的; 
在类A的析构函数中,delete一个类A的对象,就会造成死循环,堆栈溢出;
在析构函数外使用 delete后,应该立即给指针赋值 NULL防止野指针。

2.因为this是Myclass * const this指针,也就是说this指针指向的对象(不是指向的对象的值)不可以改变,所以给this赋值在编译期间就不会通过,
如果没有这语句的话是栈溢出,因为会不停的调用析构函数。

3.this被顶层const修饰不能修改。 删掉this=null后,在类的析构函数中调用delete this,delete this会去调用本对象的析构函数,而析构函数中又调用delete this,形成无限递归,造成堆栈溢出,系统崩溃。
发表于 2021-06-24 09:40:10 回复(0)
因为this是Myclass * const this指针,也就是说this指针指向的对象(不是指向的对象的值)不可以改变,所以给this赋值在编译期间就不会通过,如果没有这语句的话是栈溢出,因为会不停的调用析构函数
发表于 2017-08-01 09:43:54 回复(0)
this被顶层const修饰不能修改。 删掉this=null后,在类的析构函数中调用delete this,delete this会去调用本对象的析构函数,而析构函数中又调用delete this,形成无限递归,造成堆栈溢出,系统崩溃。
发表于 2017-08-17 11:54:39 回复(0)
mark。this是顶层const指针,是不能改变它的值的。this = null会出错。
发表于 2017-01-14 11:34:51 回复(0)
this指针是个常量,不允许修改,但可以用来做判断,比如 
string&string::operator(conststring &other) 
{ if(this==&other)  return*this; }
deletethis;语法没有错,编译都能通过,但运行时就会报错,所以不可取。
发表于 2015-10-08 13:36:34 回复(0)
难道不是因为已经delete this 了,再执行this = NULL ,编译不过了啊~求解答!
发表于 2015-09-09 20:54:16 回复(4)
this为常量指针,不能修改指向
发表于 2022-01-06 14:58:12 回复(1)
首先 只要有析构函数的定义,相当于默认已经有 delete对象这个语句了,所以第一句delete就冗余了,但这不会导致发生错误。  但是第二句 this = NULL    这个就编译不通了。  因为在类中定义构造函数后,这个this就默认时  MyClass * const this 了,这个定义的意思就是  这个对象指针是不会再指向其他了,空也不行。   (举个例子,就好比 这里有个对象叫做西瓜,那么它只能是个西瓜,你总不能让它当南瓜北瓜冬瓜吧,你要么用各种办法把它里面的瓤吃掉,要么就放那儿,总不能让西瓜凭空消失吧)
发表于 2018-07-03 18:34:22 回复(2)
this为指针常量,不能改变指针的值,所以this=NULL;是错误的,编译不通过。
delete不会改变指针的值,只是回收指针所指的资源
delete this;会调用析构函数,放在析构函数里会无限调用析构函数
编辑于 2019-06-06 22:16:38 回复(0)
此处代码可以看出this指针内容为const,不允许进行修改,故编译不成功。

如果为此句代码,则能通过编译,不过会导致栈溢出,因为不断的调用析构函数。
发表于 2017-09-06 15:34:19 回复(0)
类的构造函数中,this 指针的形式为Myclass *const this; 它是一个常量指针,指针的指向不能修改。
发表于 2016-09-18 13:47:52 回复(0)
不能修改this的指向
发表于 2023-10-24 22:36:36 回复(0)
this是一个不可以修改的const类型指针,永远指向当前对象。
发表于 2023-02-22 14:49:12 回复(0)
不能在析构函数中delete this
可以通过编译,但运行时一定会崩溃
this==null 编译会失败
发表于 2022-10-03 21:19:24 回复(0)
编译不通过主要是语句 this=NULL; 
this指针内容为const,不允许进行修改,故编译不成功。
发表于 2022-08-16 15:56:35 回复(0)
首先栈溢出是发生在运行时 这里编译没法知道的 然后this指针的值不可改,编译时就能发现
发表于 2022-04-03 11:49:50 回复(0)
this 指针的形式为Myclass *const this
const修饰this 常量指针 指针指向不能修改
发表于 2022-03-15 10:02:25 回复(0)