2013-09-24 68 views
2

我有一個函數可以處理和存儲大量數據,然後它將結果作爲類的向量返回。存儲在這個函數中的數據量是巨大的,我想在完成它的工作後清除函數的存儲內存。是否有必要這樣做(功能是否自動清除內存)還是應該通過某些功能清除內存?在函數中返回一個向量後清除內存

更新:

vector<customers> process(char* const *filename, vector<int> ID) 
{ 
    vector<customers> list_of_customers; 
    (perform some actions) 
    return list_of_customers; 
} 
+0

願你貼上一個版本,您所談的功能? –

+3

這取決於你如何分配內存並返回向量。請提供一個代碼示例。 –

+0

@POD,有(N)RVO併爲此移動語義。 – chris

回答

5

函數中本地定義的變量將在函數範圍的末尾自動釋放。任何對象的析構函數也將被調用,這應該釋放這些對象分配的任何內存(如果對象編碼正確)。這種對象的一個​​例子是std::vector

你自己分配給new的任何東西都必須有相應的delete來釋放存儲。儘量避免做自己的分配,並改用RAII,即容器或智能指針。

+0

這是我想知道的。 – POD

+1

但請注意,如果您的向量是std :: vector ,則向量不會自動返回指向的所有Thing * s。 – kfsone

2

如果函數內的對象有合適的析構函數,否則將無法在堆由mallocnew分配。他們將自動處理。否則,你應該delete他們。

例如,如果您使用的是標準容器,例如std::vector<Object> v;,則對象v將自動處理。

如果使用智能指針,可能需要new一個對象,並期望它自動釋放。

3

「我要清除的功能的存儲器後,完成了自己的工作」〜>只要你使用的是帶有自動存儲時間的對象,一切都照顧的(在內存管理方面)。內存管理問題在您開始使用動態分配時開始,這使您成爲負責清理的人員。基本上:每調用一個new,你應該調用delete,並且對於每個new[],你應該調用delete[]。所以如果可以的話,應避免在可能的時候動態分配東西。


現在注意,我們的函數值取第二個參數:

vector<customers> process(char* const *filename, vector<int> ID) 

所以當你傳遞一個std::vector<int>對象插入功能,創建這個載體的拷貝。以char* const*的形式通過filename似乎也比必要更復雜。更合理的原型在這種情況下將是:

std::vector<customers> process(const char* filename, const std::vector<int>& ID) 

現在,在這個函數的主體:

{ 
    std::vector<customers> list_of_customers; 
    ... 
    return list_of_customers; 
} 

list_of_customers是具有自動存儲持續時間的對象。在沒有優化的情況下,在調用return時,將創建此矢量的副本,並且原始對象將被正確銷燬。然而,像NRVO這樣的各種優化技術將會處理創建冗餘副本,所以您不必擔心它。如果您將在下面的方式來使用此功能:

std::vector<customers> list_of_customers = process(filename, ID); 

複製省略將最有可能發生所以沒有副本,即使沒有NRVO創建。

看一看:What are copy elision and return value optimization?

相關問題