2014-09-12 15 views
10

Jestem bardzo ciekawy, czy zwrócenie referencji z metody może spowodować wyciek pamięci. Poniżej znajduje się przykładowa sytuacja.Czy metody, które zwracają odniesienie do const lub odwołania, powodują przecieki pamięci?

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

Moje pytanie brzmi: kiedy test_val i test_vect zostaną usunięte ze stosu, gdy test_run wyjść. Czy usunięto test_vect lub test_val, powodując uszkodzenie obiektu?

+13

Wyciek pamięci może wystąpić tylko wtedy, gdy zaangażowany jest dynamiczny przydział pamięci. – Angew

Odpowiedz

16

Nie. Odnośniki są aliasami (lub nazwami) w przypadku czegoś innego. Możesz myśleć o tym, że nie posiadasz wskaźnika do czegoś bez semantycznego wskaźnika (i ich pułapek, chociaż same odnośniki mają kilka zwrotów akcji).

Po zamknięciu funkcji test_run odwołania i tylko ich nie ma. To, o czym wspomnieli, nie zostało dotknięte pamięcią, nie zostało usunięte.

Co więcej, jako że masz do czynienia tylko ze zmiennymi, które mają automatyczny czas przechowywania i nie wymagają pamięci dynamicznej podczas budowy, po prostu nie możesz tam mieć przecieków pamięci. Mógłbyś mieć inne problemy, takie jak próba usunięcia wskaźnika wskazującego na taką zmienną (próba, która spowodowała po prostu core dump on coliru), ale nie wycieków.

8

nr Dlaczego powinno to spowodować wyciek pamięci , jeśli nie są przydzielania pamięci z new, co oznacza, że ​​na sterty? Wszystkie twoje zmienne są przydzielane na stosie . Referencje są po prostu aliasami dla innych zmiennych.

C definicja ++ odniesienia według wikipedia:

Definicja odniesienia C++ jest taka, że ​​nie ma potrzeby istnieje. Może być zaimplementowana jako nowa nazwa dla istniejącego obiektu.

Istnieje również paragraph mówienie o różnicy między wskaźnikami i odniesieniami.

Powiązane problemy