我对析构函数有一个基本的问题。
假设我有以下课程
class A
{
public:
int z;
int* ptr;
A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};
}
现在析构函数应该破坏对象的实例化。 上面的析构函数完全是这样,释放由new分配的动态分配的内存。
但变量z
怎么样?我应该如何手动销毁它/释放由z
分配的内存?当课程超出范围时会自动销毁吗?
答案 0 :(得分:5)
它会自动被“破坏”,虽然因为在你的例子中int z
是POD类型,所以没有明确的析构函数......内存只是被回收。否则,如果对象有析构函数,则在主类A
的析构函数体已完成但未退出之后,将调用它来正确清理该非静态数据成员的资源。
答案 1 :(得分:4)
z
会自动销毁。每个“自动”变量都会发生这种情况。即使对于int*
,float*
,some_class*
等指针也是如此。但是,当原始指针被销毁时,它们不会自动delete
d。这就是智能指针的表现方式。
由于该属性,应始终使用智能指针来表达所有权语义。它们在复制/移动构造函数/赋值运算符中也不需要特别提及,大多数时候你甚至不需要在使用智能指针时编写它们,因为它们可以自己完成所需的所有操作。
答案 2 :(得分:2)
销毁对象也会破坏该对象的所有成员变量。您只需要删除指针,因为销毁指针不会做任何事情 - 特别是它不会破坏指针指向或释放其内存的对象。
答案 3 :(得分:0)
事实上,当课程超出范围时,会自动销毁。猜测是否是这种情况的一种非常好的方法是在声明之后没有*
。
答案 4 :(得分:0)
对于PODS(普通旧数据类型),如整数,浮点数等,它们会自动销毁。如果您将对象作为数据成员(例如std::string aStr;
),则会自动调用它们的析构函数。您只需手动处理内存释放(如上所述)或任何其他手动对象或数据清理(如关闭文件,释放资源等)。