控制C++的內存分配.doc_第1頁
控制C++的內存分配.doc_第2頁
控制C++的內存分配.doc_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

控制C+的內存分配2004-01-25 09:00 作者: 出處: 論壇 責任編輯:方舟 在嵌入式系統中使用C+的一個常見問題是內存分配,即對new 和 delete 操作符的失控。 具有諷刺意味的是,問題的根源卻是C+對內存的管理非常的容易而且安全。具體地說,當一個對象被消除時,它的析構函數能夠安全的釋放所分配的內存。 這當然是個好事情,但是這種使用的簡單性使得程序員們過度使用new 和 delete,而不注意在嵌入式C+環境中的因果關系。并且,在嵌入式系統中,由于內存的限制,頻繁的動態分配不定大小的內存會引起很大的問題以及堆破碎的風險。作為忠告,保守的使用內存分配是嵌入式環境中的第一原則。但當你必須要使用new 和delete時,你不得不控制C+中的內存分配。你需要用一個全局的new 和delete來代替系統的內存分配符,并且一個類一個類的重載new 和delete。一個防止堆破碎的通用方法是從不同固定大小的內存持中分配不同類型的對象。對每個類重載new 和delete就提供了這樣的控制。重載全局的new 和delete 操作符可以很容易地重載new 和 delete 操作符,如下所示:void * operator new(size_t size)void *p = malloc(size);return (p);void operator delete(void *p);free(p); 這段代碼可以代替默認的操作符來滿足內存分配的請求。出于解釋C+的目的,我們也可以直接調用malloc() 和free()。也可以對單個類的new 和 delete 操作符重載。這是你能靈活的控制對象的內存分配。class TestClass public:void * operator new(size_t size);void operator delete(void *p);/ . other members here .;void *TestClass:operator new(size_t size)void *p = malloc(size); / Replace this with alternative allocatorreturn (p);void TestClass:operator delete(void *p)free(p); / Replace this with alternative de-allocator 所有TestClass 對象的內存分配都采用這段代碼。更進一步,任何從TestClass 繼承的類也都采用這一方式,除非它自己也重載了new 和 delete 操作符。通過重載new 和 delete 操作符的方法,你可以自由地采用不同的分配策略,從不同的內存池中分配不同的類對象。為單個的類重載 new 和 delete 必須小心對象數組的分配。你可能希望調用到被你重載過的new 和 delete 操作符,但并不如此。內存的請求被定向到全局的new 和delete 操作符,而這些內存來自于系統堆。C+將對象數組的內存分配作為一個單獨的操作,而不同于單個對象的內存分配。為了改變這種方式,你同樣需要重載new 和 delete 操作符。class TestClass public:void * operator new (size_t size);void operator delete (void *p);/ . other members here .;void *TestClass:operator new (size_t size)void *p = malloc(size);return (p);void TestClass:operator delete (void *p)free(p);int main(void)TestClass *p = new TestClass10;/ . etc .delete p; 但是注意:對于多數C+的實現,new操作符中的個數參數是數組的大小加上額外的存儲對象數目的一些字節。在你的內存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論