1、C malloc 和 free vs C++ new 和delete:
C 語言的malloc() 和free() 並不會調用析構函數和構造函數。C++的 new 和 delete 操作符 是 "類意識" ,並且當調用new的時候會調用類的構造函數和當delete 調用的時候會調用析構函數。
下面一個例子
- // memory.cpp : 定義控制台應用程序的入口點。
- //2011/10/13 by wallwind
-
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
-
- class SS
- {
- public:
- SS();
- ~SS();
- private:
- int ff;
- int gg;
- };
- SS::SS()
- {
- ff=5;
- cout << "Constructor called" << endl;
- }
- SS::~SS()
- {
- cout << "Destructor called" << endl;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- SS *ss;
- ss = new SS; // new operator calls constructor.
- delete ss; // delete operator calls destructor.
- return 0;
- }
運行結果:
如圖一
注意:混合用malloc 和delete或者混合用new 和free 是不正確的。C++的new和delete是C++用構造器分配內存,用析構函數清除使用過的內存。
new/delete 優點:
-
new/delete調用 constructor/destructor.Malloc/free 不會.
-
new 不需要類型強制轉換。.Malloc 要對放回的指針強制類型轉換.
-
new/delete操作符可以被重載, malloc/free 不會
-
new 並不會強制要求你計算所需要的內存 ( 不像malloc)
2、C 的動態內存分配:
看如下例子MallocTest.cpp
- // memory.cpp : 定義控制台應用程序的入口點。
- //2011/10/13 by wallwind
-
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
-
- typedef struct
- {
- int ii;
- double dd;
- } SSS;
-
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- int kk, jj;
- char *str1="This is a text string";
- char *str2 = (char *)malloc(strlen(str1));
-
- SSS *s1 =(SSS *)calloc(4, sizeof(SSS));
- if(s1 == NULL) printf("Error ENOMEM: Insufficient memory available\n");
- strcpy(str2,str1); //Make a copy of the string
- for(kk=0; kk < 5; kk++)
- {
- s1[kk].ii=kk;
- }
- for(jj=0; jj < 5; jj++)
- {
- printf("Value strored: %d\n",s1[jj].ii);
- }
- free(s1);
- free(str1);
- free(str2);
-
- }
結果:
圖二
注意:
-
malloc: 用於申請一段新的地址
-
calloc: 用於申請N段新的地址
-
realloc: realloc是給一個已經分配了地址的指針重新分配空間
-
free: 通過指針釋放內存