這里非常的繞口 需要仔細的來看看:
destory(): 顯示調用一個對象的析構函數 相當於釋放一個對象需要釋放的一些動態內存 為下次真正釋放對象做准備
deallocate():真正的釋放一個內存塊。這是一個上層封裝也就是delete函數的上層封裝 在STL的空間配置器中 有可能會調用delete還給OS 也有可能就是放在內存池中 但是對於用戶來講就是釋放內存塊。
看一個例子 應該就明白了真正的含義了:
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
class A
{
public:
A()
{
data=new char[1000000];
}
~A()
{
//free the data memory
delete []data;
}
private:
char *data;
};
int main(int argc,char* argv[])
{
for(;;)
{
A *a=new A;
std::allocator<A> allocat;
allocat.deallocate(a,sizeof(A));
}
return 0;
}
明顯 這樣的做法會出問題,運行到一定的時間內會拋出異常。所以deallocate只是釋放對象內存,並沒有調用對象的構造函數釋放對象內的動態內存 這點要注意 如果調用了一個 allocat.destory(a); 程序就不會有bug了
所以在C++中, 對象釋放和對象內動態內存釋放是需要注意的 弄不好 就會出現內存泄露現象。
這里的delete操作符號本身帶有2個動作:調用析構函數 2釋放內存。而::operator delete就只有釋放內存。 deallocate函數就是基於operator delete函數封裝的。 這點需要記住
可以通過看STL源碼發現 :像vector()的析構函數都是有2個操作: destory() 釋放對象內的動態內存(如果有) deallocate是釋放對象本身占有的內存 通過這2點 就能保證內存不能泄露了 嘿嘿 這節就說到這里哦 寫這個也是為了記憶和方便以后查閱
