C++和X2B;動態(tài)數組實現(xiàn)
1AS作為一個C++初學者,來自java,我對內存管理的主題和如何避免內存泄漏越來越困惑。下面的代碼是否存在內存泄漏的風險,而我目前還沒有意識到?任何幫助或建設
解答動態(tài)
delete看起來很奇怪。沒有理由創(chuàng)建新的協(xié)議。一切都可以(而且應該)到位。順便說一句,m\u capacity=m\u capacity*2;這是一個錯誤(我懷疑是insert的拷貝粘貼)。
if在一個緊密循環(huán)中會導致嚴重的性能損失。考慮將插入循環(huán)分解為二:
(int i=0,;ilt;m_length;i++){new_arr[index+1]=arr[index];} 這將我們帶到下一點:沒有循環(huán)。復制范圍上的兩個循環(huán)。把它們分解成功能:
復制范圍(new \u arr,arr,index);new \u arr[index]=obj;copy \u range(new \u arr+index+1,arr+index,m \u length-index); 習慣用法,copyu range最好用迭代器的tem來表示,而不是用索引來表示。
請考慮在刪除太多之后收縮數組。
Const correctness 不修改基礎對象的成員函數通常應該是Const成員函數。為了示例:
Tget(int index);//O(1) 這不會修改DynamicArray的內容,并按值返回元素(不是引用),因此客戶端代碼也無法訪問DynamicArray的內部數據來修改它。因此,這幾乎肯定是一個常量成員功能:
Tget(int index)const;避免不必要的復制 現(xiàn)在您的add、insert和set成員函數都按值接受T對象。
void add(T obj);void insert(int index,T obj);void set(int index,T obj); 這意味著在DynamicArray中添加/插入/設置元素時,首先在客戶機代碼中創(chuàng)建對象的一個副本,然后復制該對象作為參數傳遞,然后執(zhí)行副本賦值將其放入數組中。對于要復制的“便宜”類型(例如int),這是可以的,但是對于要復制的昂貴類型(例如,如果有人創(chuàng)建一個DynamicArraylt;intamp;obj);void insert(int index,T constamp;obj); 這避免了僅為傳遞參數而創(chuàng)建副本,因此最終只有兩個對象實例:一個在客戶端代碼中,另一個在數組本身中,但是沒有一個額外的參數作為參數傳遞。
使用對const對象的引用允許引用引用臨時對象。例如,假設我有一個表示復數的復雜類型。如果我有一個類似myComplex+yourComplex的表達式,它將創(chuàng)建一個臨時對象。一個const對象的引用可以引用臨時(但沒有const限定符)。在C++中,0/3/5 的PultRead有一個一般規(guī)則,如果需要實現(xiàn)任何賦值、復制構造和銷毀,則可能需要實現(xiàn)所有三個來獲得一個正確管理其資源的類。析構函數,是的,你真的需要做一些事情來處理拷貝構造和拷貝分配。例如,如果創(chuàng)建Dyn的副本數組:
DynamicArraygt;foo;DynamicArraygt;bar=foo; …結果往往是丑陋的一面(例如,通常是核心轉儲)。
因此,您通常希望實現(xiàn)(至少)復制構造和復制分配,或者阻止試圖編譯的代碼,通常使用本:
卡雷(DynamicArray constamp;operator=(DynamicArray constamp;)=delete;DynamicArrayamp;)=delete; 所以三個規(guī)則包括銷毀,c- End
免責聲明:
本頁內容僅代表作者本人意見,若因此產生任何糾紛由作者本人負責,概與琴島網公司無關。本頁內容僅供參考,請您根據自身實際情況謹慎操作。尤其涉及您或第三方利益等事項,請咨詢專業(yè)人士處理。