C 類內靜態成員的記憶體釋放問題

2021-10-07 18:00:18 字數 854 閱讀 3532

前言:眾所周知如果乙個資源一旦讀入就不需要修改,且多個執行緒都載入讀取訪問這個資源,那咱們就可以將這個資源宣告為static型別,多線共享,既節省記憶體資源,也可以加快多線初始化這個資源的時間(一旦有乙個執行緒對資源進行了載入,其他執行緒可以跳重載入資源的環節)

問題:簡答描述下吧:  我的測試程式裡, new了這樣類的物件的指標,並載入了資源,進行了一系列的操作後,我delete掉這個指標,然後又去做別的操作,但是發現delete的操作並沒有釋放掉這個類物件載入的資源記憶體,導致了即使後面我的程式不用這個類了,但是記憶體還佔著。

分析: 我們都知道c/c++中靜態成員變數的記憶體的存放在全域性記憶體的靜態區域,即使是類內靜態成員,也是放在全域性記憶體中的。因此,我們雖然delete掉了這個類,但是並不代表我們真的釋放掉了類內靜態成員的記憶體,這些靜態成員的記憶體會在整個程序退出的時候由系統**,因此如果我們沒有去顯式的釋放這些靜態記憶體,而且沒有像我問題中發現的那樣,我們的程式貌似也跑的挺好。

但是這確實是乙個問題。

解決方案:

這個時候有人說了,直接將靜態改為非靜態就好了,是的,改為非靜態,記憶體**的問題立即解決,都不用改呼叫程式。但是這種情況下,每個物件都會有個資源的副本,這就從另外乙個角度浪費了記憶體(哈哈,揀了芝麻丟了西瓜),所以這種方案捨棄。

我試了兩個其他解決方案:

本來我的類內的靜態成員宣告是這樣的:

class a

private:

static  class b b;

方案1: 在a的析構裡顯式的呼叫b的析構函式,釋放記憶體

a::~a()

b.~b();

方案2:將成員變數宣告為指標,然後在a的構造裡new,在a的析構裡delete即可。

有錯誤的地方還希望指出,謝謝。

C 靜態成員的類內初始化

一般來說,關於c 類靜態成員的初始化,並不會讓人感到難以理解,但是提到c 靜態成員的 類內初始化 那就容易迷糊了。我們來看如下 1 2 include3 include4 using namespace std 56 class example 1213 14 include example.h 1...

C 類靜態成員與類靜態成員函式

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...

C 類靜態成員與類靜態成員函式

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...