C++析构器详解【C++析构器】
- 析構器(Destructor)
- 手動釋放到自動銷毀
- 發生時機
- 析構器的作用
- 語法規則
- 析構規則
- 析構器小結
- 注意
析構器(Destructor)
手動釋放到自動銷毀
我們通過傳入參數的方式,動態的申請了堆內存的大小,既是堆內存,有申請必然會有釋放的。 當然可以通過傳統的方式來釋放申請的空間,現在我們介紹一種特別用于釋放資源的方式:析構函數,與類名同(前面需要帶個~號),無參無返回。會在對象銷毀時自動被調用,我們可以將堆內存釋放,放到其內。
#include <iostream> #include <string.h> using namespace std; class Stack { public: Stack(int size) {top = 0; _size = size; space = new int[_size]{0}; }~Stack() { delete []space; }bool isEmpty(); bool isFull(); void push(int data); int pop();private: int *space; int top; int _size; };bool Stack::isEmpty() { return top == 0; }發生時機
以"~"開頭與類名相同,無參無返回的函數,在類對象銷毀時(棧/堆對象),自動調用,完成對象的銷毀。尤其是類中己申請的堆內存的釋放。
#include <iostream>using namespace std;struct Data { public:Data(int y = 0, int m = 0, int d = 0) //構造器:year(y), month(m), day(d){}~Data() //析構器{cout << "xxxxxxxxxxxxxxxxx" << endl;} private:int year;int month;int day; }; int main() {{Data d;}cout << "yyyyyyyyyyyy" << endl;Data* pd = new Data;delete pd; }執行結果為:
上面打印結果我們先進行解釋說明:
第一行是創建的對象d在{}被使用完成之后打印。
第二行是主函數進行打印。
第三行是通過pd創建對象在釋放對象的時候打印。
析構器的作用
在對象被銷毀前被自動調用,用來處理清理工作。清理工作主要清理申請的堆內存空間。
在對象銷毀前:存在的一種是棧上的空間,一種是堆上的空間。
那么上面的示例,所有的空間都是在棧區申請,所以析構器存在的意義并不是很大。上面代碼中的析構器可以不用寫,系統會提供一個空體析構器進行棧上數據的清理。
我們接下來舉例一個需要的銷毀堆上的對象:
我們動態申請的空間,就需要內存釋放;
棧對象在堆內存申請了1024個字節,在對象執行完成之后會釋放1024個字節,
構造機制和析構機制就是系統給我們提供的自動調用的過程,里面的內容還是需要我們自行編寫。
那么對于棧對象和堆對象都是一樣的,在對象執行完成之后都需要調用析構器進行空間釋放。
代碼示例:
#include <iostream> #include <string.h> using namespace std;class Stack { public:Stack(int size = 1024)//生成對象的時候調用 構造器:top(0), SpaceSize(size), space(new char[size] {0}) //初始化列表{}bool isFull();bool isEmpty();void push(char ch);char pop();~Stack() //析構器{cout << "xxxxxxxxxxxxx"<<endl;delete[]space;}private:int top;char* space;int SpaceSize; };bool Stack::isFull() {return top == SpaceSize; //修改判滿條件 }bool Stack::isEmpty() {return top == 0; }void Stack::push(char ch) {space[top++] = ch; } char Stack::pop() {return space[--top]; }int main() {{Stack s; //棧對象}Stack* ps = new Stack(1000); //堆對象delete ps;return 0; }運行結果為:
語法規則
class 類名 {~類名()析構體 }class A {~A(){} }析構規則
析構器小結
析構器并不是所有的時候都需要自實現。在沒有堆空間的對象中,可以使用系統默認提供的空體析構器。在對象有堆空間申請的情況中,必須要有自定義的析構器對于申請的堆內存空間進行釋放,析構器會在對象銷毀前自動調用。
棧上的內存空間會在對象銷毀時自動回收。
析構器與類同名,無參無返回值,前面加上一個~
在對象被銷毀前自動調用,被調用于處理清理申請的堆空間對象。
如果沒有自實現,系統提供一個默認的空體析構器。
注意
一般來說,不要把析構器劃分為函數,而是C++提供的一種機制。不能單純的理解為函數,而是一種析構機制。
總結
以上是生活随笔為你收集整理的C++析构器详解【C++析构器】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tinyxml语法讲解之写xml
- 下一篇: C++文件流:myfstream,fst