2016-04-12 97 views
-4

以下article解釋了內存泄漏。我不知道爲什麼下面的代碼導致內存泄漏。爲什麼這是一個內存泄漏?

int *data = new int; 
    *data = 15; 

當我創建data並指定15,那麼像我明白15被複制到記憶data所以我們還是有一個指向data指針,我們可以delete它。

我認爲內存泄漏將是data = 0x00123例如,對吧?這裏我們已經失去了對內存的控制,而內存真的被浪費了。

有什麼想法?

+2

泄漏是如果'delete'從未在數據指向的指針上調用,則複製'15'不是問題。 –

+2

你知道這篇文章告訴你爲什麼它在代碼下面泄漏。此外,代碼是不是內存泄漏,因爲我們沒有上下文。 – NathanOliver

回答

7

您正在有選擇地閱讀。從原來的網站

報價您鏈接:

超出範圍的指針

void memLeak() 
{ 
    int *data = new int; 
    *data = 15; 
} 

在這個例子中有內存泄漏,因爲沒有人刪除data,它變得不可達的之後memLeak

此片段:

int *data = new int; 
*data = 15; 

是不是內存泄漏本身

3

你必須考慮到代碼的完整的上下文:

void memLeak() 
{ 
    int *data = new int; 
    *data = 15; 
} 

在這種情況下,一旦函數返回時,你不再有權訪問指針,因此將無法恢復分配給該指針的內存。

-1

單獨注意,data = 0x00123比內存泄漏要糟糕得多。這是未定義的行爲

+0

爲什麼,如果我沒有訪問該內存? – Narek

+0

這是不正確的。你可以指定任何你想要的堆棧變量。 – Aenimated1

+0

@Narek,因爲這變成了一個無效的指針。標準對於無效指針非常嚴格。 – SergeyA