這篇文章主要講解了“PHP虛析構函數怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PHP虛析構函數怎么用”吧!
用一個例子來說明虛析函數的必要性.在程序清單1中,基類A的構造函數動態分配5個字節,其析構函數負責釋放這塊內存.派生類Z的構造函數動態分配5000個字節,其析構函數負責釋放這塊內存.
#include <iostream>
using namespace std;
class A{ // base class
public:
A(){
cout<<"A() firing"<<endl;
p = new char[5]; // allocate 5 bytes
}
~A(){
cout<<"~A() firing"<<endl;
delete[] p;// free 5 bytes
}
private:
char *p;
};
class Z: public A {//derived class
public:
Z(){
cout<<"Z() firing"<<endl;
q = new char[5000];//allocate 5000 bytes
}
~Z(){
cout<<"~Z() firing"<<endl;
delete[] q; //free 50000 bytes
}
private:
char *q;
};
void f();
int main(){
for(unsigned i =0; i<3; i++)
f();
return 0;
}
void f(){
A *ptr; //pointer to base class
ptr = new Z(); // pointer to derived class object
delete ptr; //~A() fires but not ~z()
}//***** Caution:50000 bytes of inaccessible storage在main中三次調用f函數:
void f(){
A *ptr; //pointer to base class
ptr = new Z(); // pointer to derived class object
delete ptr; //~A() fires but not ~z()
}//***** Caution:50000 bytes of inaccessible storage由于類A和Z的構造函數與析構函數輸出了跟蹤信息,程序運行的結果如圖所示:
將析構函數聲明為虛成員函數可以解決程序清單1中的問題:
class A{ // base class
public:
A(){
cout<<"A() firing"<<endl;
p = new char[5]; // allocate 5 bytes
}
virtual ~A(){
cout<<"~A() firing"<<endl;
delete[] p;// free 5 bytes
}
private:
char *p;
};
.......通過定義基類的析構函數~A()為虛成員函數,可以確保其派生類的析構函數也為虛成員函數.為了使代碼更清晰,我們可以明確地使用關鍵字virtual來聲明~Z(),不過即使我們不這樣做,~Z()仍然為虛成員函數,修改后的程序輸出如下圖所示:
現在,由于析構函數已經聲明為虛成員函數,當通過ptr來刪除其所指針的對象時,編譯器進行的是運行期綁定.在這里,因為ptr指向一個Z類型的對象,所以~Z()被調用.我們看到隨后~A()也被調用了,這是通過將析構函數定義為虛成員函數,我們就保證了在調用f時不會產生內存遺漏.
感謝各位的閱讀,以上就是“PHP虛析構函數怎么用”的內容了,經過本文的學習后,相信大家對PHP虛析構函數怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。