утечки памяти — глобальные динамические переменные с покрытием в переполнении стека

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

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

Я задаюсь вопросом о коде ниже,

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

Это может быть скомпилировано и запущено. Но что мне интересно, где этот массив выделен? Это глобальная переменная в куче?

C ++ Primer говорит, что глобальные переменные будут освобождены после завершения программы. Мой вопрос, это происходит, даже если они в куче?

1

Решение

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

}
1

Другие решения


По вопросам рекламы [email protected]