關於C 記憶體洩漏的一些簡單理解

2021-08-19 23:31:55 字數 837 閱讀 8305

關於類的自定義賦值運算子和複製建構函式的重要性。

反面例子:

class a

~a()

private:

int *ptr;

};void donothing(a dummy){}//值傳遞物件的危害

int main()

//y越界,呼叫析構函式刪掉了y.ptr,同時x.ptr也被刪除(它們指向相同)

a z(3);//這條語句後,x.ptr的值居然為3了!因為系統在之前x.ptr指向的地方又開闢了記憶體

donothing(z);//donothing()以值傳遞引數,預設複製建構函式以值傳遞指標,所以類似於上面的{}內的情況

和x.ptr又為不確定值

}

修改後:

class a

a(const a & obj)//自定義複製建構函式,第2句**不會出錯了

a& operator = (a& from)//自定義賦值運算子,第1句**不會出錯了

~a()

private:

int *ptr;

};void donothing(a dummy){}//值傳遞物件的危害

int main()

//y越界,呼叫析構函式刪掉了y.ptr,而x.ptr被保留

a z(3);//這條語句後,x.ptr的值不會變成3了

/*2*/ donothing(z);//donothing()以值傳遞引數,呼叫自定義複製建構函式,以引用傳遞物件,並刪除原來的記憶體並開闢新的記憶體,數值相等

被析構後,z.ptr不受影響

關於C語言記憶體的一些理解

記憶體這個大話題 key 心裡一定要有記憶體的邏輯圖。程式是什麼?程式 資料 放在flash中 段,可變的資料 全域性變數 區域性變數 放在記憶體中。執行程式的目的是什麼?得到執行結果 關注執行過程 既要結果又要過程 為什麼需要記憶體?程式中有可變資料 全域性變數 區域性變數 這些可變資料就是放在記...

關於記憶體洩漏檢測的一些方法

define crtdbg map alloc 顯示記憶體塊型別和記憶體塊分配編號 include 在輸出視窗檢視記憶體洩漏資訊,在程式結束前加入 crtdumpmemoryleaks 退出程式位置固定時 或者 crtsetdbgflag crtdbg alloc mem df crtdbg lea...

關於AOP的一些簡單理解

aop的意思的面向切面程式設計,有的業務場景都需要應用重複的 比如登入,開啟事務,結束事務,日記記錄等等。這時候我們可以將這部分 抽象成乙個切面,然後進行注入。我們所說的重複 就類似 a和 b。而aop增強是對原有程式內部注入一些邏輯 來增強原有程式功能。aop增強分為五種型別 前置增強 在目標方法...