2014-09-12 55 views
10

我很好奇,如果從方法返回引用可能導致內存泄漏。以下是示例情況。當test_valtest_vect從堆棧時test_run退出刪除返回const引用或引用的方法是否會導致內存泄漏?

class example 
{ 
public: 
    vector<int> & get_vect() 
    { 
    return vect; 
    } 
    int & get_num() 
    { 
    return num; 
    } 
private: 
    vector<int> vect; 
    int num; 
}; 


void test_run(example & input) 
{ 
    int & test_val = input.get_num(); 
    vector<int> & test_vect = input.get_vect(); 
} 

int main() 
{ 
    example one; 
    test_run(one); 
    return 0; 
} 

我的問題是。 test_vecttest_val是否被刪除,從而導致對象被損壞?

+13

只有在涉及動態內存分配時纔會發生內存泄漏。 – Angew 2014-09-12 14:40:06

回答

16

編號引用是別名(或名稱)。你可以把它看作一個指針,指向沒有指針語義的指針(和它們的陷阱,儘管引用本身有一些曲折)。

當函數test_run退出時,引用和只有它們都消失了。他們提到的內容並沒有被觸及,它並沒有被刪除。而且,由於您只處理具有自動存儲持續時間的變量,並且在構建過程中不涉及動態內存,因此您無法在此處發生內存泄漏。您可能會遇到其他問題,例如嘗試刪除指向此類變量的指針(嘗試僅產生一個core dump on coliru)但不泄漏。

8

它爲什麼要引起內存泄露,如果你不與new分配內存,這意味着在?所有變量都分配在堆棧上。對於其他變量,參考文獻僅爲別名。根據wikipedia

C++參考定義:

在C++中對參考的定義是這樣的,它並不需要 存在。它可以作爲現有對象的新名稱實現。

還有一個paragraph談論指針和引用之間的區別。

相關問題