2015-08-15 71 views
2

在閱讀字面上有幾十個關於列表,向量,new運算符,RAII和this主題的答案這裏很好的描述了內存分配,但我仍然無法設想一個滿足以下需求的實際實施。注意我在.net及其內存管理方面經驗最豐富,如果這有助於指導任何答案。如何添加新的對象實例到std :: list沒有'new'

基本上,我有類(例如class RecordFile {})封裝在一個特定的格式的文本文件。每行代表我想添加到由RecordList實例擁有的std::list<Record>的記錄,其中class Record從文件中的單行捕獲數據。

RecordList類,我有一個方法RecordList::Read()讀取文件中的行由行,創建一個新的Record實例並將其添加到由RecordList實例擁有的列表。

在這個Read()方法是一個循環遍歷文件的行,創建新的Record實例。顯然,一旦文件被讀取並且Read()方法結束,我希望記錄列表在RecordList對象中保留,但是我看不到如何在不使用'new'操作符的情況下執行此操作。

這個任務打算如何在C++中執行而不違反看似基本規則的東西?在.net中這將是微不足道的,並且完全按照所述執行,沒有任何性能或內存泄漏的風險。我知道C++是一個不同的野獸,我試圖去掌握它。

回答

4

list容器負責爲您進行內存管理。

RecordList類只需創建一個list成員如下:

std::list<Record> records_; 

那麼簡單的使用emplace_back添加行:

records_.emplace_back(<whatever parameters `Record` constructor takes>); 

RecordList被破壞,所以是list及其所有元素。

+0

這很酷,所以元素被它們的容器緊緊擁有。這是emplace_ *方法的全部意圖嗎?這對於所有元素屬於同一類類而不僅僅是一個具體類型的列表是否會以相同的方式工作? –

+0

@JCollins emplace方法的目的是在現場構建對象,而不是在其他位置構建對象,然後將其複製到容器中。不,它不適用於一系列對象,因爲你需要智能指針('unique_ptr' /'shared_ptr'),它也可以處理你的生命期。你也可以創建它們併爲它們分配內存,而不用'new',檢查函數'make_unique' /'make_shared' – imreal

+0

感謝真實的,它看起來像是C++ 14,是標準相對普遍採用了嗎? –

相關問題