問1:在類的成員函數(shù)中能不能調(diào)用delete this?
答:肯定的,能調(diào)用。
#include <iostream>#include <vector>using namespace std;class A{public: void f() { cout<<"delete this"<<endl; delete this; };};int main(){ { A a; }}問2:假設(shè)這個成員函數(shù)名字叫release,而delete this在release方法中調(diào)用,那么這個對象在調(diào)用release方法后,還能進行其他操作,如調(diào)用該對象的其他方法么?
答:仍然是肯定 的,調(diào)用release之后還能調(diào)用其他的方法。
但是有個前提:被調(diào)用的方法不涉及這個對象的數(shù)據(jù)成員和虛函數(shù)。
根本原因在于delete的功能和類對象的內(nèi)存模型。當一個類對象聲明時,系統(tǒng)會為其分配內(nèi)存空間。在類對象的內(nèi)存空間中,只有數(shù)據(jù)成員和虛函數(shù)表指針,并不包含代碼內(nèi)容,類的成員函數(shù)單獨放在代碼段中。在調(diào)用成員函數(shù)時,隱含傳遞一個this指針,讓成員函數(shù)知道是哪個對象在調(diào)用它。當調(diào)用delete this時,類對象的內(nèi)存空間被釋放。在delete this之后進行的其他任何函數(shù)調(diào)用,只要不涉及到this指針的內(nèi)容,都能夠正常運行。一旦涉及到this指針,如操作數(shù)據(jù)成員,調(diào)用虛函數(shù)等,就會出現(xiàn)不可預(yù)期的問題。
問3:為什么是不可預(yù)期的問題?delete this之后不是釋放了類對象的內(nèi)存空間了么,那么這段內(nèi)存應(yīng)該已經(jīng)還給系統(tǒng),不再屬于這個進程。照這個邏輯來看,應(yīng)該發(fā)生指針錯誤,無訪問權(quán)限之類的令系統(tǒng)崩潰的問題才對啊?
答:這個問題牽涉到操作系統(tǒng)的內(nèi)存管理策略。delete this釋放了類對象的內(nèi)存空間,但是內(nèi)存空間卻并不是馬上被回收到系統(tǒng)中,可能是緩沖或者其他原因,導(dǎo)致這段內(nèi)存空間暫時沒有被系統(tǒng)收回。此時這段內(nèi)存是可以訪問的,但是當你獲取數(shù)據(jù)成員,可能得到的是一串很長的隨機數(shù);訪問虛函數(shù)表時,指針無效的可能性非常高,很可能造成系統(tǒng)崩潰。
程序崩潰示例代碼
#include <iostream>#include <vector>using namespace std;class A{public: int a; A(int t = 0) { a = t; } void f1() { //使用了該對象的數(shù)據(jù)成員 cout<<a<<endl; } void f2() { //未使用該對象的數(shù)據(jù)成員 cout<<1<<endl; } virtual void f3() { cout<<a<<endl; } void release() { cout<<"delete this"<<endl; delete this; };};int main(){ { A a(10); a.f1(); a.f2(); a.f3(); a.release(); a.f1(); a.f2(); a.f3(); }}問4:如果在類的析構(gòu)函數(shù)中調(diào)用delete this,會發(fā)生什么?
答:實驗告訴我們,會導(dǎo)致堆棧溢出。
delete的本質(zhì)是將調(diào)用一個或多個析構(gòu)函數(shù),然后,釋放內(nèi)存。顯然,delete this會去調(diào)用本對象的析構(gòu)函數(shù),而析構(gòu)函數(shù)中又調(diào)用delete this,形成無限遞歸,造成堆棧溢出,系統(tǒng)崩潰。
#include <iostream>#include <vector>using namespace std;class A{public: ~ A() { cout<<"delete this"<<endl; delete this; };};int main(){ { A a; }}總結(jié)
在成員函數(shù)中調(diào)用delete this,會導(dǎo)致指針錯誤;
在析構(gòu)函數(shù)中調(diào)用delete this,會造成棧溢出;
this是類中成員函數(shù)具有的一個附加的隱含形參,即指向該類對象的一個指針,它與調(diào)用成員函數(shù)的對象綁定在一起;
this的值不可變;
class A{public: void f(A a) { //this = &a; //error: lvalue required as left Operand of assignment }};?
請尊重作者的勞動,轉(zhuǎn)載請注明作者及原文地址(http://blog.csdn.net/lis_12/article/details/56049284).
如果覺得本文對您有幫助,請點擊‘頂’支持一下,您的支持是我寫作最大的動力,謝謝。
新聞熱點
疑難解答
圖片精選