C++中 destory() 和deallocate()以及delete函數的相關性和區別性


  

這里非常的繞口  需要仔細的來看看:

 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點  就能保證內存不能泄露了  嘿嘿  這節就說到這里哦  寫這個也是為了記憶和方便以后查閱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM