2017-04-16 71 views
2

我當時正在運行一個小程序以獲得樂趣,並遇到一個讓我感到困惑的問題。C++新操作符分配新內存

#include <iostream> 
#include <string> 

using namespace std; 

struct T 
{ 
    int val; 
}; 
int main() 
{ 
    for(int i = 0; i < 2; ++i) 
    { 
     T *p = new T; 
     cout << p << endl; 
     delete p; 
    } 

    T *q = new T; 
    cout << q << endl; 
    delete q; 

    return 0; 
} 

輸出:

0x16b76d0 
0x16b76d0 
0x16b76d0 

他們都在同一個內存位置?

+2

是的,在這種情況下,它們都是相同的位置*。你的程序正在做的是爲同一個對象重用相同的內存(爲什麼不是這樣;在每次delete後它不再被使用,並且如果內存管理器認爲它適合,可用於另一個分配,並且在這種情況下) 。 – WhozCraig

回答

4

打印地址後正在刪除內存。然後內存管理器可以自由選擇相同的地址來分配新的內存。

1

編譯OS(操作系統)一起決定分配給您的動態分配的內存,其內存地址。當調用delete時,指針指向的內存地址不再被引用。因此,編譯器可以自由地爲您的新分配使用相同的內存地址。這不是我們在這個編程水平上控制的東西。

+0

與編譯器無關。在程序運行並請求動態存儲的時候,編譯器的工作已經很久了。 – user4581301