2014-09-12 13 views
10

Tôi vô cùng tò mò nếu trả lại một tham chiếu từ một phương pháp có thể gây ra rò rỉ bộ nhớ. Dưới đây là tình huống ví dụ.Các phương thức có thể trả về tham chiếu const hoặc tham chiếu gây rò rỉ bộ nhớ?

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; 
} 

Câu hỏi của tôi là khi test_valtest_vect sẽ bị xóa khỏi stack khi test_run thoát. Có hoặc là test_vect hoặc test_val bị xóa do đó khiến đối tượng bị hỏng?

+13

Rò rỉ bộ nhớ chỉ có thể xảy ra nếu phân bổ bộ nhớ động có liên quan. – Angew

Trả lời

16

Không. Tham chiếu là bí danh (hoặc tên) cho mục đích khác. Bạn có thể coi nó như là một con trỏ không bao giờ sở hữu đến một cái gì đó mà không có ngữ nghĩa con trỏ (và những cạm bẫy của chúng, mặc dù tham chiếu tự có một vài xoắn).

Khi chức năng test_run thoát, các tham chiếu và chỉ có chúng biến mất. Những gì họ nói đến đã không được xúc động trí nhớ, nó đã không bị xóa. Ngoài ra, vì bạn chỉ xử lý các biến có thời lượng lưu trữ tự động và không liên quan đến bộ nhớ động trong khi xây dựng, bạn chỉ đơn giản là không thể có rò rỉ bộ nhớ ở đó. Bạn có thể có các vấn đề khác như cố gắng xóa một con trỏ trỏ đến biến số đó (cố gắng chỉ mang lại core dump on coliru) nhưng không bị rò rỉ.

8

số Tại sao nó nên gây ra một ký ức rò rỉ, nếu bạn không phân bổ bộ nhớ với new, có nghĩa là trên đống? Tất cả các biến của bạn được phân bổ trên ngăn xếp . Tham chiếu chỉ là bí danh cho các biến khác.

C++ định nghĩa tham khảo theo wikipedia:

Định nghĩa của một tham chiếu trong C++ là như vậy mà nó không cần phải tồn tại. Nó có thể được thực hiện như một tên mới cho một đối tượng hiện có.

Ngoài ra còn có một số paragraph nói về sự khác biệt giữa con trỏ và tham chiếu.

Các vấn đề liên quan