回 帖 发 新 帖 刷新版面

主题:[讨论]析构函数的调用

程序一:

#include <iostream>
using namespace std;

class book
{
public:
    book()
    {
        
    }
    ~book()
    {
        cout<<"destructing"<<endl;
    }
    void display()
    {
        cout<<"book name is: English"<<endl;
    }
protected:
private:
};
// book mybook;     //第一节点
void main()
{
//    book mybook;          //第二节点
    mybook.display();
}

当我在第一节点定义对象mybook时,输出为:
book name is: English
Press any key to continue
当我在第二节点定义对象mybook时,输出为:
book name is: English
destructing
Press any key to continue
  为什么啊?难道在第一节点定义就不调用析构函数吗??
再看下面:
程序二:

#include <iostream.h>

class book
{
public:
    book()
    {
        
    }
    ~book()
    {
        cout<<"destructing"<<endl;
    }
    void display()
    {
        cout<<"book name is: English"<<endl;
    }
protected:
private:
};
// book mybook;     //第一节点
void main()
{
//     book mybook;          //第二节点
    mybook.display();
}
这个程序无论mybook在哪儿定义,输出都是:
book name is: English
destructing
Press any key to continue
注意程序一与程序二在处理<iostream.h>时不同

高手请解答一下

回复列表 (共1个回复)

沙发

想楼主一定是在VC6.0中试验这段代码的吧,楼主发现的这个问题确实很蹊跷,但有一点可以肯定,这是VC6.0编译系统自身的问题!
为了防止可能出现的输出显示问题,我在楼主所示代码的析构函数中增加了system("pause"):
#include <iostream>
#include <cstdlib>
using namespace std;

class book
{
public:
    book()
    {

    }
    ~book()
    {
        cout<<"destructing"<<endl;
        system("pause"); //暂停一下,查看输出
    }
    void display()
    {
        cout<<"book name is: English"<<endl;
    }
protected:
private:
};

book mybook;     //第一节点
int main()
{
    //book mybook;          //第二节点
    mybook.display();
    return 0;
}
结果发现,同样的代码在DEV-C++、Code::Blocks、VC2005、C-Free中试验,它们都正确的调用了析构函数,唯独VC6.0中未能见到调用。想到业界一致公认的VC6.0对C++标准库支持存在的诸多问题,因此我只能猜想这是VC6.0对C++标准支持不好的又一例证吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册