内存分为三种:静态内存(静态变量/成员、全局变量)、栈和堆。
全局变量的定义是在任何函数之外定义的变量。
我想知道下面的代码,
#include<iostream>
int *test=new int[5]();
int main(){
return 0;
}
它可以编译并运行。但我想知道的是,该数组在哪里分配?它是堆上的全局变量吗?
C++ Primer 说当程序结束时全局变量将被释放。我的问题是,即使它们在堆上也会发生这种情况吗?
内存分为三种:静态内存(静态变量/成员、全局变量)、栈和堆。
全局变量的定义是在任何函数之外定义的变量。
我想知道下面的代码,
#include<iostream>
int *test=new int[5]();
int main(){
return 0;
}
它可以编译并运行。但我想知道的是,该数组在哪里分配?它是堆上的全局变量吗?
C++ Primer 说当程序结束时全局变量将被释放。我的问题是,即使它们在堆上也会发生这种情况吗?
指针test
只是一些变量(指针类型)。它是在内存的静态部分分配的,但是它指向的(即 5int
秒的内存)是在堆上分配的一些内存块。后者不会自动取消分配。用于存储指针的内存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()
{
}