以下幾種情況都可能引發執行時或編譯時錯誤:
1)delete不是new分配的空間
2)重複delete new分配的空間兩次以上
3)在釋放動態陣列時忘了方括號對
inti;int
*pi=&i;
delete
pi;
//vs 2008
會執行時錯誤
string str=
"dwarves";
delete
str;
//vs 2008
會編譯錯誤
int*p=
newint
();
deletep;
delete
p; //vs 2008
會執行時錯誤
int*p=new
int[10]();
delete
p; //vs 2008
執行時並未報錯,但會產生記憶體洩露。對於某些系統或元素型別,有可能帶來嚴重的執行時錯誤 //
因此在釋放動態陣列時千萬別忘了方括號對
如果指標值為0,則在其上delete操作是合法的,c++保證刪除0的指標是安全的。但這樣做無任何意義
int *p=0;
delete p;
//ok
筆記:由此可以看出類的設計者,只需管理自己的指標資料成員的析構,而不能去管理類的使用者傳進來的指標引數。如果也去析構,很有可能析構傳進的引數時發生crash。記住誰分配誰釋放的原則
int *p=new int; //不加圓括號,內建型別不會初始化
int *pi=new int(); //初始化為0
對於有預設建構函式的類型別則以下兩句效果一樣
string *ps=new string;
string *ps=new string();
new表示式無法獲取需要的記憶體空間,系統將丟擲bad_alloc的異常
C primer(第四版)讀書筆記5
extern int i declares but does not define i int i declares and defines i extern宣告不是定義,也不分配儲存空間。事實上,它只是說明變數定義在程式的其他地方。程式中變數可以宣告多次,但只能定義一次。如果宣告有初始化式,那麼它...
C Primer中文版第四版 讀書筆記
2011.8.10 p46 只有當extern 宣告位於函式外部時,才可以含有初始化式。extern double pi 3.1416 pi 是乙個全域性變數,這是乙個定義 p50 在全域性作用域宣告的const 變數是定義該物件的檔案的區域性變數 僅作用在該檔案中 要使 const 變數能夠在其他...
C Primer 第四版讀書筆記(五)之語句
通常情況下,語句是順序執行的。但是,除了最簡單的程式外,只有順序執行往往並不足夠。為此,c 定義了一組控制流語句,允許有條件地執行或者重複地執行某部分功能。1.1 簡單語句 c 中,大多數語句以分號結束。表示式語句用於計算表示式。1.2 宣告語句 在c 中,物件或類的定義或宣告也是語句。1.3 復合...