Существует три вида памяти: статическая память (статические переменные / члены, глобальные переменные), стек и куча.
Определение глобальных переменных — это переменные, определенные вне каких-либо функций.
Я задаюсь вопросом о коде ниже,
#include<iostream>
int *test=new int[5]();
int main(){
return 0;
}
Это может быть скомпилировано и запущено. Но что мне интересно, где этот массив выделен? Это глобальная переменная в куче?
C ++ Primer говорит, что глобальные переменные будут освобождены после завершения программы. Мой вопрос, это происходит, даже если они в куче?
Указатель 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()
{
}