2013-05-21 136 views
1

當在C和C++中釋放內存時,我只需要內存地址還是需要任何特定變量?C/C++中的內存管理範圍

所以,如果我做一些事情,如:

int* test() 
{ 
    int* x = new int(5); 
    return x; 
} 

int main(int argc, char** argv) 
{ 
    int* y = test(); 

    delete y; 

    return 0; 
} 

這會導致內存泄漏?謝謝!

+0

這裏沒有泄漏。但是,要避免這樣的代碼,其中通過函數分配內存並手動解除分配。另一個開發人員在沒有這方面知識的情況下使用功能測試是造成相當多內存泄漏問題的原因。 – Laz

回答

7

沒有,就不會有任何有泄漏,但話又說回來,也不會有,如果來

int test() 
{ 
    return 5; 
} 

int main(int argc, char** argv) 
{ 
    int y = test(); 
    return 0; 
} 

避免動態分配。

+3

*如果可以,請避免動態分配*真實。如果你無法避免它,請使用智能指針。 – syam

+0

哦,不,不,傻。我實際上不會那麼樂意投入動態分配。這只是一個例子,說明了我想要解釋的問題。 :d – Lemmons

1

A pointer與名稱狀態一樣,只是指向堆上對象的地址。所以你做的很好。

請參閱here瞭解不同的線程。

1

你只需要內存地址來釋放分配的空間。但要確保你相應地釋放它(在C++),即稱之爲delete y[]如果它是一個數組,這樣的...

在C語言中,你只需要只有基址,當你調用free(),完整的分配空間將被釋放。 代碼中不會有任何內存泄漏。

2

您的代碼不會泄漏(正如其他人已經說過的那樣)。但是,它需要很少打破,並可能泄露:

int* test() 
{ 
    int* x = new int(5); 
    return x; 
} 

int main(int argc, char** argv) 
{ 
    int* y = test(); 
    int* z = test(); 
    delete y; 
    delete z; 
    return 0; 
} 

此代碼現在潛在的泄漏,因爲new可以扔了,如果到new第二次調用(z=...)則拋出第一個指針(y)能永遠不會被刪除。任何其他可能拋出的函數(不只是第二次調用new)都會導致同樣的問題。


這就是爲什麼智能指針是一個必須具備的:他們使用RAII,讓你寫異常安全的代碼,這是體面C的基礎++。此代碼根本無法泄漏:

std::unique_ptr<int> test() 
{ 
    std::unique_ptr<int> x(new int(5)); 
    return x; 
} 

int main(int argc, char** argv) 
{ 
    std::unique_ptr<int> y = test(); 
    std::unique_ptr<int> z = test(); 
    return 0; 
}