【问题标题】:Destructor doesn't print line on console析构函数不在控制台上打印行
【发布时间】:2018-05-02 16:05:32
【问题描述】:

我正在使用 Visual Studio 2013 并打印一些 cout 命令进行测试,当我调试我的代码时,控件进入两个类的析构函数但它没有在控制台上打印 cout 语句。

#include <iostream>  
using namespace std;

class Uni
{
 public:
 ~Uni()
 {
    cout << "I am in Uni Destructor" << endl;
 }

 Uni()
 {
    cout << "I am in Uni Constructor" << endl;
 }

};


class Student: public Uni
{
 public:

 Student()
 {
    cout << "I am in Student Constructor" << endl;
 }
 ~Student()
 {
    cout << "I am in Student Destructor" << endl;
 }



};

int main()
{
  Student s;
  system("pause");
  return 0;
}

输出:

我在 Uni Constructor 中

我在学生构造函数中

【问题讨论】:

    标签: c++ inheritance destructor


    【解决方案1】:

    我想您此时会得到输出,即在pause 之后。

    int main()
    {
      Student s;
      system("pause");
    
      // here; but s is not destroyed yet
      return 0;
    }
    

    但此时s 仍未被销毁。当超出它声明的范围时,它会被销毁,即当离开函数main时。

    您可以将s 放入进一步的测试范围内。

    int main()
    {
      {
        Student s;
      } // s will be destroyed here
    
      system("pause");
      return 0;
    }
    

    【讨论】:

    • 在哪些对象中创建堆或堆栈?
    • 如果某个东西是在堆中创建的,我们会删除它吗?
    • @kappo 对不起,我没明白你的意思。您的意思是在使用new 创建对象时使用delete
    • @kappo 是的,如果你创建像Student* ps = new Student; 这样的对象,那么你必须像delete ps; 那样明确地销毁它。此时对象被销毁,析构函数将被调用。
    【解决方案2】:

    您的代码看起来不错,cout 是一个缓冲的控制台输出流对象实例:您确定您的析构函数消息不只是在最后一个右大括号和 cout 刷新之后缓冲写入吗?

    【讨论】:

      猜你喜欢
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2022-01-08
      • 2023-03-14
      • 2013-06-15
      相关资源
      最近更新 更多