如何手动销毁成员变量?

时间:2012-01-11 19:21:58

标签: c++ destructor

我对析构函数有一个基本的问题。

假设我有以下课程

class A
{
public:

int z;
int* ptr;

A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};

}

现在析构函数应该破坏对象的实例化。 上面的析构函数完全是这样,释放由new分配的动态分配的内存。

但变量z怎么样?我应该如何手动销毁它/释放由z分配的内存?当课程超出范围时会自动销毁吗?

5 个答案:

答案 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;),则会自动调用它们的析构函数。您只需手动处理内存释放(如上所述)或任何其他手动对象或数据清理(如关闭文件,释放资源等)。