1

Существует три вида памяти: статическая память (статические переменные/члены, глобальные переменные), стек и куча.Глобальные динамические переопределенные переменные в C++

Определение глобальных переменных - это переменные, определенные вне любых функций.

мне интересно, о коде ниже,

#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 –

ответ

1

Указатель test - это просто переменная (типа указателя). Он выделяется в статической части памяти, однако то, на что оно указывает (т. Е. Память для 5 int s), является некоторой частью памяти, выделенной в куче. Последнее не будет автоматически отменено. Память, используемая для хранения указателя 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- переменные не согласны с вашим ответом. –

+0

@Richard Это другое и не применяется здесь. '* pFoo' не является глобальным объектом -' pFoo' является! И C++ полностью назвал бы деструктор 'pFoo', если бы он был один. Но типы указателей не имеют деструктора ('Foo' имеет один,' Foo * 'has not). –

+0

@ KonradRudolph точно, хорошее дополнение, вот что я хотел сказать. «Указанная» память не является самим объектом. Я надеялся, что я дал понять это в ответе. – vsoftco

Смежные вопросы