C 釋放指向類的void型別指標造成記憶體洩漏

2021-08-21 19:07:08 字數 670 閱讀 2355

先來看一段**

#include using namespace std;

class a

~a()

void func() };

class myautoptr //定義乙個指向a類的智慧型指標

~myautoptr() }

private:

void* m_p;//指向a物件的位址。

};void test()

int main(void)

輸出結果如下

a() ....

delete m_p

這段**中myautoptr類中有乙個void類指標m_p指向類a,最後在物件auto_p銷毀時呼叫myautoptr類中析構函式釋放掉m_p指向的記憶體即類a,按理來說是會呼叫類a的析構函式進行進一步的釋放,但是輸出結果表示系統只執行到了myautoptr類中的析構函式,並未呼叫類a的析構函式,這就造成了類a的記憶體並未被釋放。

若將myautoptr類中的指標m_p改為a型別,再次執行就顯示正確的呼叫了類a的析構函式。

由此可知,若乙個void型別指標指向了乙個類,那麼系統在釋放這個指標時並不會呼叫該類中的析構函式去釋放記憶體,會造成記憶體洩漏。這也是為什麼c++中模板類大多需要呼叫者在呼叫時顯式標註資料型別的原因。

指向void型別的指標

指向void的指標是個非常有趣的東西,乙個指向任何物件型別的指標都可以賦值給型別為void 的變數,void 可以賦值給另乙個void 兩個void 可以比較是否相等 當兩個指標比較時,是看它們是否指向同一塊記憶體位址 而且可以顯示的將void 轉換到另乙個型別。初次之外,其他任何對void 的操作...

指向void的指標

萬能指標 乙個指向任何物件型別的指標都可以賦值給型別為void 的變數,void 可以賦值給另外乙個void 倆個void 可以比較相等與否,而且可以顯式地將void 轉換到另乙個型別。其他操作都是不安全的,因為編譯器並不知道實際被指向的是那種物件。因此,對void 做其他任何操作都將引起編譯錯誤。...

Void型別的指標 C語言

關鍵字 void 表示函式不接受任何引數或不返回任何值,同時還可以用在建立通用指標 乙個可指向任何型別的資料物件的指標。如 void ptr 將ptr 宣告為乙個通用指標,但沒有指定它指向的東西。void 指標最常見的用途是用於宣告函式的引數。你可能會希望你的乙個函式能夠處理不同的型別的引數,可以將...