考慮我具備的功能:刪除引用本地創建的指針
int &create_ptr(){
int *x = new int;
*x =5;
return *x;
}
int main(){
int y = create_ptr();
}
這會不會導致內存泄漏還是有某種方式將其刪除? 對不起,如果這是一個基本問題,這只是擾亂我,我無法真正找到答案。
謝謝大家,現在有道理!
考慮我具備的功能:刪除引用本地創建的指針
int &create_ptr(){
int *x = new int;
*x =5;
return *x;
}
int main(){
int y = create_ptr();
}
這會不會導致內存泄漏還是有某種方式將其刪除? 對不起,如果這是一個基本問題,這只是擾亂我,我無法真正找到答案。
謝謝大家,現在有道理!
爲了滿足你的好奇心,是的,你可以安全地使用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();
}
對於int&x = create_ref()示例,必須將x聲明爲引用嗎? –
@JoshDM是的,因爲它是安全和正確的'刪除'。 –
非常好的解釋,謝謝。 –
是的,這會造成內存泄漏。您使用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;
}
更好的方法是返回一個智能指針,但它超出了這個問題的範圍。
這會造成內存泄漏嗎?
是的,它會的。您正在使用new
語句分配動態內存,但沒有相應的delete
將其釋放,請注意:您有內存泄漏。
是否有某種方式來刪除它?
當然有:不要做裸指針的動態內存分配。就你而言,爲什麼你甚至需要參考?
int create(){
return 5;
}
int main(int, char*[]){
int y = create();
}
如果你真的需要動態內存,你可以使用std::shared_ptr
和std::make_shared
這樣的:
#include <memory>
auto create_ptr() {
return std::make_shared<int>(5);
}
int main(int, char*[]) {
std::shared_ptr<int> y = create_ptr();
}
既然你創建堆INT * X = INT新內存;,你需要明確刪除。
如果您想避免跟蹤所有堆內存並將其明確刪除,則可以使用共享指針。
當最後一個引用超出範圍時,共享指針記錄對內存的所有引用,刪除指向的內存。
如果複製結果,則不是。 – chris
我想你想在'main'中使用'int&y = create_ptr();'。那麼這是個好問題。如問,「刪除」顯然是無效的。 –
編輯你[嘗試](http://stackoverflow.com/revisions/20208657/2)將使所有已經給出的答案無效。請不要根本改變你的問題。 – Shoe