1

有三種內存:靜態內存(靜態變量/成員,全局變量),堆棧和堆。C++中的全局動態Allcoated變量

全局變量的定義是在任何函數之外定義的變量。

我想了解一下下面的代碼,

#include<iostream> 
int *test=new int[5](); 
int main(){ 
    return 0; 
} 

它可以被編譯和運行。但是我想知道的是,該數組在哪裏分配?它是堆上的全局變量嗎?

C++ Primer說,當程序結束時,全局變量將被釋放。我的問題是,這是否會發生,即使他們在堆上?

+0

見http://stackoverflow.com/questions/2204608/does-c-call-destructors-for-global-and-class-static-variables – 2015-04-04 23:20:16

回答

1

指針test只是一些變量(指針類型)。它分配在內存的靜態部分,但它指向的內存(即內存)是堆中分配的一部分內存。後者不會自動解除分配。用於存儲指針test(最常見的是4或8個字節,取決於機器)的內存將在程序終止時被標記爲可用,但不是指針指向的內容。要說服自己,試試這個:

#include <iostream> 

struct Foo 
{ 
    Foo() 
    { 
     std::cout << "Foo()" << std::endl; 
    } 
    ~Foo() 
    { 
     std::cout << "~Foo()" << std::endl; 
    } 
}; 

Foo* pFoo = new Foo; // no automatic destructor call at exit, memory/resource leak 

// destructor is called below, as Foo (and not Foo*) is now global 
// (and not a pointer-to-Foo that has no destructor, thanks @Konrad Rudolph) 
Foo foo; 

int main() 
{ 

} 
+0

的http:// stackoverflow.com/questions/2204608/does-c-call-destructors-for-global-and-class-static-variables不同意你的答案。 – 2015-04-04 23:21:00

+0

@Richard這是不同的,不適用於此。 '* pFoo'不是全局對象 - 'pFoo'是!而C++絕對會調用'pFoo'的析構函數,如果它有的話。但指針類型沒有析構函數('Foo'有一個,'Foo *'沒有)。 – 2015-04-04 23:25:08

+0

@KonradRudolph正好,好的補充,這就是我的意思。 「指向」內存不是對象本身。儘管如此,我希望我在答案中明確表示。 – vsoftco 2015-04-04 23:25:55