C++中,如果对象是用new操作生成的,那么它的空间被分配在堆(Heap)上,只有显示地调用delete(或delete[])才能调用对象的析构函数并释放对象的空间。那么,在程序的其他存储区(Data段,Stack)上的对象依据什么样的顺序产生和销毁的呢?
考察如下程序。
#include <iostream>
#include <string>
using namespace std;
class A
{
string name;
public:
A(string s)
{
name=s;
cout<<"object "<<name<<" has been created"<<endl;
}
~A(){
cout<<"object "<<name<<" has been destroyed"<<endl;
}
};
void func1()
{
static A sa1("static_object_1");
}
void func2(){
static A sa2("static_object_2");
}
int main(int argc,char* argv[])
{
A la1("local_object_1");
A la2("local_object_2");
func1();
func2();
getchar();
}
A a1("global_object_1");
A a2("global_object_2");
程序运行结果:
object global_object_1 has been created
object global_object_2 has been created
object local_object_1 has been created
object local_object_2 has been created
object static_object_1 has been created
object static_object_2 has been created
object local_object_2 has been destroyed
object local_object_1 has been destroyed
object static_object_2 has been destroyed
object static_object_1 has been destroyed
object global_object_2 has been destroyed
object global_object_1 has been destroyed
阅读以上程序的时候,注意以下几点: (1)全局对象或全局静态对象不管是在什么位置定义的,它的构造函数都在main()函数之前执行。 (2)局部静态对象的构造函数是当程序执行到定义该对象时才被调用。 (3)所有在栈(stack)上的对象都比在全局或静态对象早销毁。 (4)不管是在栈上的对象,还是全局或静态对象,都遵循这样的顺序:越是先产生的对象越是后被销毁。
[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.15(P180-P181)]