C++中,如果对象是用new操作生成的,那么它的空间被分配在堆(Heap)上,只有显示地调用delete(或delete[])才能调用对象的析构函数并释放对象的空间。那么,在程序的其他存储区(全局/静态存储区,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)]