以下article解釋了內存泄漏。我不知道爲什麼下面的代碼導致內存泄漏。爲什麼這是一個內存泄漏?
int *data = new int;
*data = 15;
當我創建data
並指定15,那麼像我明白15被複制到記憶data
所以我們還是有一個指向data
指針,我們可以delete
它。
我認爲內存泄漏將是data = 0x00123
例如,對吧?這裏我們已經失去了對內存的控制,而內存真的被浪費了。
有什麼想法?
以下article解釋了內存泄漏。我不知道爲什麼下面的代碼導致內存泄漏。爲什麼這是一個內存泄漏?
int *data = new int;
*data = 15;
當我創建data
並指定15,那麼像我明白15被複制到記憶data
所以我們還是有一個指向data
指針,我們可以delete
它。
我認爲內存泄漏將是data = 0x00123
例如,對吧?這裏我們已經失去了對內存的控制,而內存真的被浪費了。
有什麼想法?
您正在有選擇地閱讀。從原來的網站
報價您鏈接:
超出範圍的指針
void memLeak()
{
int *data = new int;
*data = 15;
}
在這個例子中有內存泄漏,因爲沒有人刪除data
,它變得不可達的之後memLeak
此片段:
int *data = new int;
*data = 15;
是不是內存泄漏本身
你必須考慮到代碼的完整的上下文:
void memLeak()
{
int *data = new int;
*data = 15;
}
在這種情況下,一旦函數返回時,你不再有權訪問指針,因此將無法恢復分配給該指針的內存。
單獨注意,data = 0x00123
比內存泄漏要糟糕得多。這是未定義的行爲。
爲什麼,如果我沒有訪問該內存? – Narek
這是不正確的。你可以指定任何你想要的堆棧變量。 – Aenimated1
@Narek,因爲這變成了一個無效的指針。標準對於無效指針非常嚴格。 – SergeyA
泄漏是如果'delete'從未在數據指向的指針上調用,則複製'15'不是問題。 –
你知道這篇文章告訴你爲什麼它在代碼下面泄漏。此外,代碼是不是內存泄漏,因爲我們沒有上下文。 – NathanOliver