输出不正确

时间:2015-01-02 13:30:52

标签: c++ constructor destructor

我正在使用Dev C ++编译器。我有这段代码:

#include <iostream>
using std::cout;
class Test
{
    public:
        Test();
        ~Test();
};
Test::Test()
{
        cout << "Constructor is executed\n";
}
Test::~Test()
{
        cout << "Destructor is executed\n";
}
int main()
{
        new Test();
        return 0;
}

输出

    Constructor is executed

在此代码中,为什么没有自动调用析构函数。

但是当我尝试这段代码时:

#include <iostream>
using std::cout;
class Test
{
    public:
        Test();
        ~Test();
};
Test::Test()
{
        cout << "Constructor is executed\n";
}
Test::~Test()
{
        cout << "Destructor is executed\n";
}
int main()
{
        delete new Test();
        return 0;
}

输出

    Constructor is executed
    Destructor is executed

这些产出差异的原因是什么?

4 个答案:

答案 0 :(得分:2)

new动态创建的对象永远不会自动销毁;他们只被delete摧毁。你的第一个例子没有这样做(所以对象被泄露了),你的第二个例子就是这样做了。

如果您希望自动销毁它,请给它自动存储时间:

int main()
{
    Test t;       // Created here, on declaration
    return 0;     // Destroyed here, when it goes out of scope
}

答案 1 :(得分:2)

就像你撒尿()然后一旦红外线自动厕所尿道传感器检测到你已经完成,它会冲你的小便。

{
   pee p;
}

但红外线自动厕所小便池传感器并未安装在任何地方,因此您必须按下旋钮才能冲洗尿液。

{ 
  pee *p = new pee();
  delete p;
}
你现在有所不同吗?

答案 2 :(得分:1)

这是因为删除会调用刚刚用new创建的对象的析构函数。

所以在这种情况下,没有delete =没有析构函数调用。

看起来你是C ++的新手,所以对于你的信息,两个对象都是在堆上创建的。 (将其用于未来的研究)。

答案 3 :(得分:0)

您已在堆上创建了对象。这意味着您必须在该对象上显式调用delete以取消分配该对象占用的内存。