输出不正确
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;
}
你现在有区别吗?
我正在使用 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;
}
你现在有区别吗?