構造和析構的幾點注意事項

2021-10-10 17:48:40 字數 1979 閱讀 4940

變數要初始化,初始化盡量使用初始化列表。如果不初始化,變數的值是隨機不確定的。

class

point

;// 改進之後後

class

point

private

:int _x;

int _y;

};

私有析構函式,類物件不能在棧上分配空間.只能在堆上分配,但不能delete直接釋放。

#include

using

namespace std;

class

point

void

destory()

private:~

point()

private

:int _x;

int _y;};

intmain

(int argc,

char

const

*ar**)

遮蔽new和delete, 物件只能在棧上分配

#include

using

namespace std;

class

point

point

(int x,

int y):_x

(x),

_y(y)

// 刪除或者私有new 和 delete

void

*operator

new(size_t size)

=delete

;void

operator

delete

(void

* ptr)

=delete

;// private:

// void* operator new(size_t size);

// void operator delete(void* ptr);

private

:int _x;

int _y;};

intmain

(int argc,

char

const

* ar**)

多型基類宣告為虛析構函式,否則可能會導致記憶體洩漏,繼承類獨有的記憶體未能被釋放。**如下

反之,不要設定虛析構函式,導致冗餘記憶體。

#include

using

namespace std;

class

base

~base()

private

:char

* a;};

class

derived

:public base

~derived()

private

:char

* b;};

intmain

(int argc,

char

const

* ar**)

output:

[root@localhost poco_demo]

# g++ tt.cpp -std=c++11 -o tt

[root@localhost poco_demo]

# ./tt

~base

不要在析構函式中丟擲異常,這樣可能會導致記憶體無法釋放等錯誤。正確的做法是,捕獲並處理掉這些錯誤,讓析構正常結束,而不是一層層丟擲。

不要再析構和建構函式,使用虛函式。虛函式是通過虛函式表控制,類通過虛函式表指標,訪問虛函式表。虛函式表指標作為乙個成員變數,在構造時初始化,析構時結束生命週期。在繼承體系中,這樣做會更混亂。

不要私有乙個虛函式,因為這沒什麼意義。只要拿到_vptr,就可以訪問虛函式表,進而繞過private訪問虛函式。

析構函式和建構函式的注意事項

1建構函式 在c 中,使用建構函式來實現物件的初始化。建構函式的特點 1 建構函式無需呼叫,建立物件時自動執行。2 建構函式的名稱必須與類名相同,不能隨意起名 不同以初始化函式,雖然和其功能相同 3 建構函式沒有返回值。4 如果程式者沒有自定義建構函式,系統會自動呼叫預設的建構函式。5 如果程式者自...

關於使用析構函式的幾點注意事項

析構函式為你提供了一種機制,可以讓你在系統釋放物件前做一些善後工作,如清理記憶體,釋放空間等。但是在以下兩個方面使用虛構函式時要尤為注意。1.多型性 具有多型性質的base classes的析構函式應該為virture,或者說任何帶有virture函式的class都應該有virture析構函式。考慮...

c 建構函式和析構函式丟擲異常的注意事項

從語法上來說,建構函式和析構函式都可以丟擲異常。但從邏輯上和風險控制上,建構函式和析構函式中盡量不要丟擲異常,萬不得已,一定要注意防止資源洩露。在析構函式中丟擲異常還要注意棧展開帶來的程式崩潰。1.建構函式中丟擲異常 在c 建構函式中,既需要分配記憶體,又需要丟擲異常時要特別注意防止記憶體洩露的情況...