当你想编写自己的析构函数,覆盖默认的析构函数时,我在用C ++编写类时遇到了一些麻烦吗?我理解析构函数的目的是什么,当你不想使用编译器提供的那个时,我只是感到困惑。提前谢谢。
答案 0 :(得分:2)
自定义析构函数用于释放您可能已动态分配的资源。例如,如果您使用new或malloc分配了动态内存,如果您的类具有文件句柄成员变量或网络套接字,则您的自定义析构函数将确保释放/关闭所有这些资源。
答案 1 :(得分:2)
如果您不提供一个,编译器将为您添加一个,但这可能无法满足您的需要。通常,如果您在类中手动分配静态存储内存(通常在构造函数中并使用new
),则析构函数必需。如果你的类破坏时也没有delete
,那么内存将不会释放,你将有内存泄漏 =非常糟糕。
但是析构函数对于你想要完成的其他操作也很有用。
我个人通常不会编写析构函数,因为我永远不会分配内存我必须自己管理 - 感谢大多数现代C ++库中的共享指针和智能指针,你通常可以指望内存自动获取通过使用它们发布。例如,Qt有QSharedPointer
和std
,boost
具有类似的自动内存管理类。
答案 2 :(得分:1)
看一下rule of three和RAII成语,你会看到一些例子,说明我们为什么以及何时定义我们自己的析构函数。
答案 3 :(得分:0)
每当使用指针时,都需要定义自定义析构函数。参加以下课程:
class Foo {
public:
Foo(int&);
Foo();
~Foo(); //Custom Destructor
int* getData();
void setData();
private:
int* data;
};
这里一个类Foo
存储一个指向整数的指针。由于我们存储指针,因此我们需要告诉C ++在销毁对象时删除该指针指向的数据。为此,请使用delete
关键字,如下所示:
Foo::~Foo() {
delete data;
}
如果未指定自定义析构函数,即使销毁对象,也不会删除数据。虽然存储整数的4个字节可能看起来不多,但在使用许多对象的大型程序中它可以加起来。
作为旁注(你可能没有这个,但值得一提),你应该总是将析构函数指定为虚拟。这样,如果有人扩展了类,程序将调用正确的析构函数,而不是默认为基类(这是某些多态情况下的默认行为)。