2012-08-22 79 views
5

動態數組然而,這只是我要求澄清的分配的一部分:從ATM.txtC++而不STL

負載數據,並存儲他們在一個動態陣列(ATM型, 不STL)當程序啓動。

如何在沒有STL的情況下執行動態數組?我想也許分配意味着使用指針,「ATM類型」扔我離開。

它再次提到:

文件accounts.txt到一個動態數組(帳戶類型,而不是STL)

分配的--not部分

我永遠無法理解使用內存不安全操作,例如從第一行拉取文件中的項目數量:

例如,

5 
abc 
def 
hij 
kml 
mno 

豈不是聰明使用STL(載體,或C++ 11陣列)和文件中不依賴於數,因爲它可能不準確引起的緩衝區溢出等?

//編輯 在包含數據成員文件Account.h定義一個類賬戶:客戶 ID,BSB號碼等

我假設帳戶和ATM類型是那些類。

+3

「那豈不是更聰明的使用STL」當然會的。 :)但如果這是一項任務,這具有教育價值。 –

+0

什麼是「ATM型」? –

+1

ATM不是C++中的標準或衆所周知的術語。你的任務/課程是否定義了它? –

回答

4

動態數組的最基本的形式是一個用new[]創建和銷燬使用delete[]

ATM * atms = new ATM[count]; 
// do stuff with the array 
delete [] atms; 

但是,這帶來的危險,使用數組的代碼可能會拋出異常,從函數返回或以其他方式阻止delete[]發生。如果發生這種情況,那麼你將失去指向分配內存的唯一指針,並且它將保持分配但不可訪問;這被稱爲內存泄漏。由於這個原因,最好是包裹在陣列中的一類,具有:

  • 成員變量的指針存儲到數組中,和(任選地)其大小
  • 構造和/或功能來分配陣列
  • 析構函數刪除陣列
  • (任選)(多個)功能來調整陣列

刪除一個對象的析構函數分配使用的RAII原則,以確保噸一旦數組不再需要,它將被刪除。

這留下了一個更多的危險:如果你複製這個數組對象,那麼你最終會得到兩個對象,它們都試圖刪除相同的數組,這是非常危險的。爲了防止這種情況,您需要考慮Rule of Three。要麼寫一個拷貝構造函數和複製賦值操作符來分配一個新數組並複製這些內容;或刪除它們。 (如果你正在學習老式的C++,那麼你不能刪除成員函數,所以你必須聲明它們是私有的,而不是實現它們)。

使用STL不是更聰明嗎?

通常,是的。但是如果你正在學習C++,理解內存管理是如何工作的以及如何讓庫爲你處理它是個好主意。這可能是此練習的一部分。

+0

這是一篇非常翔實的文章,謝謝你解釋危險。通常我使用de構造函數來釋放 – user1617478

1

這種分配的常用方法是模擬自己的矢量的自動擴展行爲。爲堆中的數據分配一個數組,並跟蹤它的長度和存儲在數組中的項數。

一旦你用數據填充了數組,將最大大小擴大一些並分配一個新數組。這使您可以將舊數組中的數據複製到新數組中,然後繼續添加項目,直到再次用盡空間。

+5

實際上,* common *方法將決定你永遠不能有超過1024個條目,使用固定數組並希望最好;-) –

+0

有沒有人真的在生產中做到這一點?或者更多的是學習它是如何工作的? – user1617478

+0

@ user1617478:很多人*做*;但在我看來,他們中沒有人應該*。但瞭解內存管理是如何工作的,以及爲什麼你應該儘可能避免自己做這件事情當然是有用的。 –

0

基本上,如果您需要實現動態數組而不使用STL,則必須明確處理內存分配/釋放。

基本上你必須:

  • 分配空間使用malloc首次陣列被構建或使用
  • 跟蹤插入/移除的元件的
  • 當完成所分配的空間
  • 使用的realloc
  • 釋放陣列銷燬時分配的空間

當然,像std :: vector這樣的容器就像一個好的STL不是一件容易的事情(最終是一個不錯的功課!)。

我可以建議如下:

  • 避免儘可能多的重新分配。當空間完成後,分配一些空間以避免連續調用realloc(請參閱std :: vector :: reserve)
  • 避免在刪除元素時重新分配空間。一旦分配完畢,除非內存使用率過高,否則請按原樣分配空間,以避免未來重新分配。
+0

我一直認爲矢量管理內存比基本更有效,當完全製作更大的陣列並複製它時。 – user1617478

+0

@ user1617478:由於向量的內存必須是單個連續的塊,因此這是管理它的唯一方法。它通過成倍增長(這會減少重新分配的數量,從而減少重新分配的數量),並允許您保留空間以避免重新分配,從而儘可能地提高效率。 –

0

豈不是聰明使用STL(載體,或C++ 11陣列)和不 文件中依靠數量,因爲它可能不準確引起 緩衝器溢出等?

std :: vector的內部不是魔術。可以手動執行std :: vector爲你做的事情。

聽起來這就是你應該爲這項任務做的事情;使自己的'ATM類型'可以從ATM.txt文件中安全地管理讀取數據,'帳戶類型'可以保存來自accounts.txt文件的數據。你應該得到一些澄清,從誰寫的任務,他們如何預期這些類型的設計/使用。同時回顧一下你所擁有的任何課堂資料,應該告訴你在使用動態數組方面你需要知道什麼。

-1

因爲這是家庭作業,我們不希望直接給出答案,但總的來說我的建議是:

  1. 使類myDynamicArray
  2. 使類包含一個int或長的存儲陣列大小
  3. 使用「新」爲陣列分配內存。從賦值看,它看起來可能是一串字符串,或者如果教授嚴格禁止STL(字符串現在被認爲是STL),它將是一個字符數組數組。
  4. 編寫一個插入方法,在插入之前,檢查數組的大小(請參閱#2),如果它不夠大,則使其更大。一種不使用pre-C++函數(我假設這是最好的,因爲這是一個C++類)的做法是分配一個更大的新數組 - >從舊數組複製數據 - >插入任何新數據。多大?比如,你可以選擇比每個新分配大20%的比例。微軟的C#分配了「下一個最大素數」的元素,雖然他們有很快的內存分配例程。
  5. 不要忘記刪除()動態數組時完成它(什麼「完成」意味着取決於分配)。請注意,一旦程序退出,技術上應該自動釋放內存,但是不要自行釋放內存是一種非常糟糕的做法(想象一下規模較大,非學術型程序不會定期關閉)。

我會避免其他用戶提供的模板代碼。我相信這是很棒的代碼,但它會引起人們的注意,以便在早期的C++類中使用先進的東西。

推薦閱讀: http://www.cplusplus.com/doc/tutorial/dynamic/