国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

4 c++ delete this

2019-11-08 01:34:39
字體:
供稿:網(wǎng)友

C++ delete this

問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).

如果覺得本文對您有幫助,請點擊‘頂’支持一下,您的支持是我寫作最大的動力,謝謝。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 长葛市| 凤阳县| 布尔津县| 黔江区| 嘉祥县| 华池县| 高密市| 宁明县| 黔江区| 屏边| 南部县| 棋牌| 开远市| 丽江市| 白河县| 新龙县| 黄平县| 三穗县| 扬州市| 固安县| 黔东| 宜阳县| 江阴市| 原平市| 东乡族自治县| 股票| 云梦县| 嵩明县| 建昌县| 连平县| 舒兰市| 高雄市| 沧源| 称多县| 彝良县| 青田县| 刚察县| 瑞安市| 镇坪县| 娱乐| 香河县|