effective C 學習文件(2)

2021-06-08 10:50:25 字數 2651 閱讀 9745

紅色的字型表示(個人認為重點)

綠色字型是我的感想

紅色和黑色都是原文哦

大多數情況下,執行動態記憶體分配的的類都在建構函式裡用

new分配記憶體,然後在析構函式裡用

delete

釋放記憶體

如果在析構函式裡沒有刪除指標,它不會表現出很明顯的外部症狀。相反,它可能只是表現為一點微小的記憶體洩露,並且不斷增長,最後吞噬了你的位址空間,導致程式夭折。因為這種情況經常不那麼引人注意,所以每增加乙個指標成員到類裡時一定要記清楚。

另外,刪除空指標是安全的(因為它什麼也沒做)。所以,在寫建構函式,賦值操作符,或其他成員函式時,類的每個指標成員要麼指向有效的記憶體,要麼就指向空,那在你的析構函式裡你就可以只用簡單地delete掉他們,而不用擔心他們是不是被new過。

除非類成員最初用了new,否則是不用在析構函式裡用delete的。比如智慧型指標是不用手動刪除的:auto_ptr

operator new

在無法完成記憶體分配請求時會丟擲異常

目前看來我還遇不到類似的情況,以後回來補上

重寫operator new方法

自己重寫operatornew時(條款10解釋了為什麼有時要重寫它),很重要的一點是函式提供的行為要和系統預設的operator new一致。實際做起來也就是:要有正確的返回值;可用記憶體不夠時要呼叫出錯處理函式(見條款7);處理好0位元組記憶體請求的情況。此外,還要避免不小心隱藏了標準形式的

new

operator new實際上會不只一次地嘗試著去分配記憶體,它要在每次失敗後呼叫出錯處理函式,還期望出錯處理函式能想辦法釋放別處的記憶體。只有在指向出錯處理函式的指標為空的情況下,operatornew才丟擲異常。

所以個人認為「

new」還是很偷懶的,小錯它不管的,只有捅破天了它才會出來 在

c++中記憶體的操作使用還是很重要的,但是我目前才疏學淺,更本還沒用到過

- -,先大致看一下吧。。。

c++標準要求,即使在請求分配0位元組記憶體時,operatornew也要返回乙個合法指標

void * operator new(size_tsize)        // operator new還可能有其它引數

while (1)

}當中省略…………用的不多不感興趣啊。我直接看一下總結吧

可見,有關operator new和operator delete(以及他們的陣列形式)的規定不是那麼麻煩,重要的是必須遵守它。只要記憶體分配程式支援new-handler函式並正確地處理了零記憶體請求,就差不多了;如果記憶體釋放程式又處理了空指標,那就沒其他什麼要做的了。至於在類成員版本的函式裡增加繼承支援,那將很快就可以完成。

書上有乙個形象生動的例子:

因為內部範圍宣告的名稱會隱藏掉外部範圍的相同的名稱,所以對於分別在類的內部

和全域性宣告的兩個相同名字的函式f來說,類的成員函式會隱藏掉全域性函式:

voidf();                            // 全域性函式

class x ;

x x;

f();                                 //

呼叫 f

x.f();                               //

呼叫 x::f

這不會令人驚訝,也不會導致混淆,因為呼叫全域性函式和成員函式時總是採用不同的

語法形式。然而如果你在類裡增加了乙個帶多個引數的operator new函式,結果就有

可能令人大吃一驚。

class x ;

voidspecialerrorhandler();          //定義在別的地方

x *px1 =

new (specialerrorhandler) x;       // 呼叫x::operator new

x *px2 = newx;                     // 錯誤!

在類裡定義了乙個稱為「operator new」的函式後,會不經意地阻止了對標準new的訪

問。條款50解釋了為什麼會這樣,這裡我們更關心的是如何想個辦法避免這個問題。

乙個辦法是在類裡寫乙個支援標準new呼叫方式的operator new,它和標準new做同樣

的事。這可以用乙個高效的內聯函式來封裝實現。

class x

};x *px1 =

new (specialerrorhandler) x;      // 呼叫 x::operator

// new(size_t, new_handler)

x* px2 = newx;                    // 呼叫 x::operator

// new(size_t)

另一種方法是為每乙個增加到operator new的引數提供預設值(見條款24):

class x ;

x *px1 = new (specialerrorhandler)x;              // 正確

x* px2 = newx;                                    // 也正確

無論哪種方法,如果以後想對「標準」形式的new定製新的功能,只需要重寫這個函式。

呼叫者重新編譯鏈結後就可以使用新功能了。

哈哈,顯然這個是要

mark

一下的啦,以後用到了我還會回來的哦

Git學習文件

git本地版本維護基本操作 git 本地倉庫 維護三棵樹 工作區 暫存區 head 工作區 當前 工作環境 暫存區 通過git add將 新增到暫存區 head 指向最新一次的提交 git status 檢視修改的檔案狀態 git add 把修改提交到暫存區 git commit m comment...

Angular js 學習文件

angular js 指令 ng init key value 在其中使用鍵值對定義資料 在html中使用key呼叫資料 ng model 把元素值繫結到應用程式 一般出現在文字框中 定義key 然後把輸入的值顯示 ng model同樣可以為應用程式資料提供型別驗證 為應用程式提供狀態 為html元...

OpenStack學習文件

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 neutron 網路模組 cinder 快儲存塊 ebs共享儲存 swift 物件儲存模組 keystone 認證模組 glance 顯像管...