输出不正确

Incorrrect Output

我正在使用 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

在这段代码中,为什么没有自动调用 Destructor。

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

#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

这些输出不同的原因是什么?

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

因为delete调用了刚刚用new创建的对象的析构函数

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

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

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

如果你想让它自动销毁,那么给它自动存储时间:

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

这就像你撒尿(),然后当红外线自动马桶小便池传感器检测到你撒尿后,它就会冲掉你的小便。

{
   pee p;
}

但红外线自动马桶小便器感应器并不是随处都安装的,所以你必须按下旋钮,它才能冲洗你的小便。

{ 
  pee *p = new pee();
  delete p;
}

你现在有区别吗?