effective c++ 條款16:成對使用new和delete時要采用相同形式
記住:
- 如果你在new表達式中使用[ ],必須在相應的delete表達式中也是用[ ]。如果你在new時不使用[ ],一定不要在delete時使用[ ]。
string* stringPtr1 = new string; string* stringPtr2 = new string[100]; ... delete stringPtr1; //刪除一個對象 delete[] stringPtr2; //刪除一個由對象組成的數組
最好不要用數組形式做typedef,基本都可以使用vector之類的
typedef string AddressLines[4]; string* pal = newAddressLines; //註意,這裏相當於 new string[4] ... delete pal; //行為為定義 delete[] pal; //正確
effective c++ 條款16:成對使用new和delete時要采用相同形式
相關推薦
effective c++ 條款16:成對使用new和delete時要采用相同形式
最好 class 你在 pan TE fec IV line PE 記住: 如果你在new表達式中使用[ ],必須在相應的delete表達式中也是用[ ]。如果你在new時不使用[ ],一定不要在delete時使用[ ]。 string* stringPtr1 = n
effective c++條款16:成對使用new和delete時要採取相同形式
下面的程式碼會產生什麼樣的後果? #include <iostream> using namespace std; int main(void) { std::string *StringArray = new std::string[30]; delete StringAr
effective c++ 條款13:以對象管理
行為 fec ret 拷貝構造函數 AR clas 釋放 AS RR 記住: 為防止資源泄漏,請使用RAII對象,它們在構造函數中獲得資源並在析構函數中釋放資源。 兩個常被使用的RAII類分別是tr1::shared_ptr和auto_ptr。前者通常是較佳選擇,因為其c
effective c++條款34:區分介面繼承和實現繼承
1. 純虛擬函式也可以有具體實現 #include <iostream> using namespace std; class Airplane { public: virtual void fly(const char *)const = 0; }; void Airplan
effective c++條款09:絕不在構造和析構過程中呼叫virtual函式
#include <iostream> using namespace std; class BaseClass { public: BaseClass() { cout << "BaseClass" << endl; } ~
成對使用new和delete時要採取相同形式
delete 基本型別直接呼叫free。 複雜型別先呼叫解構函式,再呼叫operator delete. delet[] 基本型別直接呼叫operator delete. 複雜型別先取出指標前面的四個位元組的數字,決定呼叫幾次解構函式,再呼叫operator delete.在這裡需要注意的是如果在這裡呼叫de
effective c++ 條款15:在資源管理類中提供對原始資源的訪問
nth invest AR and effect ptr 比較 c++ 顯示轉換 記住: APIs往往要求訪問原始資源,所以每一個RAII類應該提供一個“取得其所管理之資源”的辦法。 對原始資源的訪問可能經由顯示轉換或隱式轉換。一般而言顯示轉換比較安全,但隱式轉換對客戶比
effective c++ 條款17:以獨立語句將newd對象置入智能指針
執行 順序 ID 條款17 隱式轉換 ive 遺失 解決 red 記住: 以獨立語句將newd對象存儲於智能指針內。如果不這樣做,一旦異常被拋出,有可能導致難以察覺的資源泄漏。 int priority(); void processWidget(std::tr1::
effective c++ 條款06:若不想使用編譯器自動生成的函數,就該明確拒絕
ble 這樣的 ive c++ 拒絕 類對象 析構 並且 防止 記住:為防止編譯器暗自提供的功能,可將相應的成員函數聲明為privae並且不予實現。也可以使用Uncopyable這樣的父類實現。 對於獨一無二的對象,希望不支持拷貝構造函數和賦值操作符。 class Hom
effective c++ 條款07:為多態基類聲明virtual析構函數
pub effective atomic water delet () IV del effect 記住:帶多態性質的基類應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。class的設計目的如果不是作為基
effective c++ 條款19:設計class猶如設計type
調用 還需要 構造 protected explicit protect cte 操作符 創建 記住: 在定義一個新type之前,確定已經考慮過本條款覆蓋的主題 要設計高效的class,需要回答以下的問題:1. 對象如何去創建和銷毀?這是構造函數和析構函數的問題,當然如
effective c++條款20:寧以pass-by-reference-to-const替換pass-by-value
1. 更高效 考慮如下的一個base class和derived class: class Base { private: std::string name; std::string address; public: Base(){} ~Base(){}
effective c++條款17:以獨立語句將newed物件置入智慧指標
假設有這麼一個函式process,它接收一個MyClass型別的指標與 一個函式,如果按下面的方式呼叫: #include <iostream> #include <memory> using namespace std; class MyClass { p
effective c++條款14:在資源管理類中小心copying行為
對於智慧指標auto_ptr和tr1::shared_ptr,它們在作用域結束時會將所指內容自動刪除。 然而對於某些系統資源,比如互斥鎖(muxex)等並不是在堆中申請的,是長期存在的,只能去釋放,不能將其刪除,這樣,我們就不能用智慧指標去管理它,資源管理類是個好的選擇。 考慮用下面的類
effective c++條款11:在operator=中處理自我賦值
int a = 3; a = a; 這就是自我賦值,你可能覺得這個自我賦值不痛不癢,造成不了什麼後果,那麼下面這個呢? #include <iostream> using namespace std; class MyClass { public: int *p; publ
effective c++條款23:寧以non-member non-friend替換member函式
舉書上的例子: class WevBrowser { public: WevBrowser(){} ~WevBrowser(){} public: void ClearCache(); void ClearHistory(); void RemoveC
effective c++條款24:若所有引數皆需要型別轉換,請為此採用non-member函式
考慮一個有理數的類: class Rational { public: Rational(int nc = 0, int dc = 1):n(nc), d(dc){} ~Rational(){} private: int n, d; //n為分子,d為分母 }; 我們想要實現諸
effective c++條款33:避免遮掩繼承而來的名稱
1. using 考慮下面程式: #include <iostream> using namespace std; class Based { public: void Func() { cout << "Base" << endl; }
effective c++條款32:確定你的public繼承塑模出is-a關係
舉書上的例子: class Bird { public: void Fly(); }; class Penguin : public Bird { }; 企鵝也是鳥,但是企鵝並不能飛,也就是說“並不是鳥就能飛”,不滿足is-a關係 再來一個例子: class Person
effective c++條款30:透徹瞭解inlining的裡裡外外
inline函式的優點: 1. 避免了函式呼叫帶來的額外開銷(inline函式相當於巨集定義,在編譯期就被替換到呼叫處)。 2. 編譯器會對inline函式進行最優化。 inline函式的缺點: 1. 如果inline函式過大並且多次呼叫,會造成可執行檔案體積恐怖的增大。 2