歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++動態空間的申請

為什麼C++的動態分配是new和delete?

因為malloc 函數和對應的free函數不能調用構造函數和析構函數,這破壞了空間分配、初始化的功能。所以引入了new和delete。

[cpp]
  1. //============================================================================   
  2. // Name        : main.cpp   
  3. // Author      : ShiGuang   
  4. // Version     :   
  5. // Copyright   : [email protected]   
  6. // Description : Hello World in C++, Ansi-style   
  7. //============================================================================   
  8.   
  9. #include <iostream>   
  10. #include <string>   
  11. using namespace std;  
  12.   
  13. class aa  
  14. {  
  15. public:  
  16.     aa(int a = 1)  
  17.     {  
  18.         cout << "aa is constructed." << endl;  
  19.         id = a;  
  20.     }  
  21.     int id;  
  22.     ~aa()  
  23.     {  
  24.         cout << "aa is completed." << endl;  
  25.     }  
  26. };  
  27.   
  28. int main(int argc, char **argv)  
  29. {  
  30.     aa *p = new aa(9);  
  31.     cout << p->id << endl;  
  32.     delete p;  
  33.   
  34.     cout << "" << endl;  
  35.   
  36.     aa *q = (aa *) malloc(sizeof(aa));  
  37.     cout << q->id << endl;//隨機數 表明構造函數未調用   
  38.     free(q);//析構函數未調用   
  39. }  
運行結果:
[cpp]
  1. aa is constructed.  
  2. 9  
  3. aa is completed.  
  4.   
  5. 3018824  

堆空間不伴隨函數動態釋放,程序員要自主管理

[cpp]
  1. //============================================================================   
  2. // Name        : main.cpp   
  3. // Author      : ShiGuang   
  4. // Version     :   
  5. // Copyright   : [email protected]   
  6. // Description : Hello World in C++, Ansi-style   
  7. //============================================================================   
  8.   
  9. #include <iostream>   
  10. #include <string>   
  11. using namespace std;  
  12.   
  13. class aa  
  14. {  
  15. public:  
  16.     aa(int a = 1)  
  17.     {  
  18.         cout << "aa is constructed." << endl;  
  19.         id = a;  
  20.     }  
  21.     ~aa()  
  22.     {  
  23.         cout << "aa is completed." << endl;  
  24.     }  
  25.     int id;  
  26. };  
  27.   
  28. aa & m()  
  29. {  
  30.     aa *p = new aa(9);  
  31.     delete p;  
  32.     return (*p);  
  33. }  
  34.   
  35. int main(int argc, char **argv)  
  36. {  
  37.     aa & s = m();  
  38.     cout << s.id;// 結果為隨機數,表明被釋放   
  39. }  
Copyright © Linux教程網 All Rights Reserved