1. 程式人生 > >2.16 C++類與new和delete操作符

2.16 C++類與new和delete操作符

運行 out 可能 clas cout std 存儲 分配 程序

參考: http://www.weixueyuan.net/view/6347.html

總結:

  

當我們需要為類對象動態分配存儲空間時,我們應該使用C++語言提供的new與new[]操作符,而不要使用C語言提供的malloc函數

雖然malloc函數具有分配存儲空間的功能,但是這些函數除了分配存儲空間外,不會調用類的構造函數。而C++語言提供的new和new[]操作符則不會如此,使用它們為對象分配存儲空間的同時,它們也會調用相應的構造函數。

操作符delete和delete[]在釋放對象存儲空間的同時也會調用析構函數,而free函數則不會調用析構函數。

例1:

#include<iostream>
using
namespace std; class test { public: test(int i = 1){num = i;cout<<num<<" Constructor"<<endl;} ~test(){cout<<num<<" Destructor"<<endl;} private: int num; }; int main() { test * t0 = new test(0); test * t1 = new test[5]; test * t2 = (test *)malloc
(sizeof(test)); delete t0; delete[] t1; free(t2); return 0; }

程序運行結果:

0 Constructor
1 Constructor
1 Constructor
1 Constructor
1 Constructor
1 Constructor
0 Destructor
1 Destructor
1 Destructor
1 Destructor
1 Destructor
1 Destructor

從程序運行結果不難看出malloc確實沒有調用構造函數,free也沒有調用析構函數。在這裏可能有人會覺得這沒有遵循析構函數調用順序,其實不是這樣的,因為我們在delete t0;的語句的時候就已經要求編譯器銷毀t0對象了,此時其它對象還處於存活期

,因此t0先走一步,調用析構函數。之後再銷毀t1所指向的對象數組。

2.16 C++類與new和delete操作符