2013-11-26 39 views
0

考慮我具備的功能:刪除引用本地創建的指針

int &create_ptr(){ 
    int *x = new int; 
    *x =5; 
    return *x; 
} 
int main(){ 
    int y = create_ptr(); 
} 

這會不會導致內存泄漏還是有某種方式將其刪除? 對不起,如果這是一個基本問題,這只是擾亂我,我無法真正找到答案。

謝謝大家,現在有道理!

+1

如果複製結果,則不是。 – chris

+0

我想你想在'main'中使用'int&y = create_ptr();'。那麼這是個好問題。如問,「刪除」顯然是無效的。 –

+0

編輯你[嘗試](http://stackoverflow.com/revisions/20208657/2)將使所有已經給出的答案無效。請不要根本改變你的問題。 – Shoe

回答

2

爲了滿足你的好奇心,是的,你可以安全地使用delete,但只有當你通過引用(指針或C++引用(&))返回它時。通過參考以保留您的new ed對象的原始地址。你需要這個地址才能正確和安全地對你的對象delete

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

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

int create_sane_version() { 
    return 5; 
} 

int main(){ 
    int& x = create_ref(); 
    delete &x; // OK. Get address of x; same as deleting through a pointer pointing to its address 
       // x here refers to the newed object inside create_ref() (*x) 
       // Still begs the question of why you're painstakingly doing this 

    int* y = create_ptr(); 
    delete y; // OK, but not optimal (the above isn't either) 
       // * not optimal == a bad way to do this 

    int leak = create_ref(); 
    delete &leak; // DEFINITELY NOT OK. leak isn't the same as the newed object 
        // i.e. &leak != &create_ref(); 
        // You're actually *copying* the object referred to by the returned 
        // reference. The returned reference gets lost. 

    int best_way_to_do_this = create_sane_version(); 
} 
+0

對於int&x = create_ref()示例,必須將x聲明爲引用嗎? –

+0

@JoshDM是的,因爲它是安全和正確的'刪除'。 –

+0

非常好的解釋,謝謝。 –

0

是的,這會造成內存泄漏。您使用new分配空間,但從未使用delete釋放空間。

如果您想在免費商店中創建對象(或基元類型),您可以返回一個指針,並使該函數調用者可以刪除指向的對象。

// Caller is responsible for deleting pointed-to int. 
int* create_ptr() 
{ 
    // Hope that operator new does not throw std::bad_alloc 
    int* x = new int; 
    *x = 5; 
    return x; 
} 

更好的方法是返回一個智能指針,但它超出了這個問題的範圍。

1

這會造成內存泄漏嗎?

是的,它會的。您正在使用new語句分配動態內存,但沒有相應的delete將其釋放,請注意:您有內存泄漏。


是否有某種方式來刪除它?

當然有:不要做裸指針的動態內存分配。就你而言,爲什麼你甚至需要參考?

int create(){ 
    return 5; 
} 

int main(int, char*[]){ 
    int y = create(); 
} 

如果你真的需要動態內存,你可以使用std::shared_ptrstd::make_shared這樣的:

#include <memory> 

auto create_ptr() { 
    return std::make_shared<int>(5); 
} 

int main(int, char*[]) { 
    std::shared_ptr<int> y = create_ptr(); 
} 
0

既然你創建堆INT * X = INT新內存;,你需要明確刪除。

如果您想避免跟蹤所有堆內存並將其明確刪除,則可以使用共享指針。

當最後一個引用超出範圍時,共享指針記錄對內存的所有引用,刪除指向的內存。