我正在使用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
这些产出差异的原因是什么?
答案 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
以取消分配该对象占用的内存。