我的小海军:关于C++的小问题,请大虾帮忙,谢谢

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/06 11:31:54
VC++6.0中,析构函数对多个对象进行析构的顺序是由什么决定的?请看下面这个例子:

#include <iostream>

using namespace std;

class myclass{
};

int main(){
myclass ob1,ob2;
return 0;
}

像这样的程序,我试验得出都是ob2对象先被析构,然后再是ob1对象被析构,为什么是这个顺序呢?
请具体说明,小弟感激不尽!!!!!

为什么会是先OP2再op1呢?仔细看下面一句:
myclass ob1,ob2;

由于你采用栈分配对象的内存(不是堆),所以编译器会先把ob1做push动作压入栈,再对ob2做push动作压入栈,在释放的时候,由于栈是后进先出的,所以会先对ob2做pop动作,发现其是对象,就调用其析构函数,然后再对ob1做pop,发现还是一个对象,就调用其析构函数.这样就造成你说的情况了,你可以这么写试一下,就会反过来:
myclass ob2,ob1;

LZ真的很细心,这样的问题很少有人发现的,相信LZ的编程水平会一日千里.

按某种字母顺序排的次序析构,编排方式是编译器定的。

例如:
int ob1,ob2,ob3;
或 int ob2,ob3,ob1;
或 int ob3,ob1,ob2;
分配地址时的次序还是ob3,ob2,ob1.(地址低到高)。

编译器的编译工作是从“取一字符”起分若干步完成的,分配地址不是按“取一字符”的顺序。

也就是说“析构"的顺序不是按“取一字符”的顺序,而是分步完成的。所以奇怪。