1

什么是三法则?提到

在执行析构函数的主体并销毁主体内分配的任何自动对象后,X 类的析构函数调用 X 的直接 [...] 成员的析构函数 [n3126.pdf 12.4 §6]

这让我想知道,如果不破坏成员,析构函数有什么用?请提供例子

4

5 回答 5

3

这是成员自己不负责的额外清理工作。或者在资源管理的情况下,确保与对象关联的资源被正确释放。请记住,并非所有成员都有将被调用的析构函数(指针没有析构函数)。因此,如果您有指针,则需要手动管理它们。

使用指针的示例资源管理。

shared_ptr::~shared_ptr()
{
    if (decrementReferenceCountAndCheckForZero())
    {
        cleanupResources();
    }
}

例子。使用框架。没有成员知道框架,但工人知道。

MyWorker::MyWorker()
{
     Framwork::Register(this);
}
MyWorker::~MyWorker()
{
    Framework::Unrigester(this);
}
于 2013-05-27T18:04:54.303 回答
2

一旦对象不再存在,与需要解除关联/释放/特殊处理的类实例相关联的任何内容。
几个例子:

  • 由实例打开、拥有和使用的文件句柄,不会在对象销毁后使用。
  • 类实例打开和拥有的 Socktes、互斥锁等。
于 2013-05-27T17:53:58.080 回答
1

该语句的所有含义是,如果您将析构函数定义为

Foo::~Foo()
{
    Bar b;
    b.do_whatever();
}

然后b对象的析构函数在任何Foo成员的析构函数之前运行。析构函数的主体被执行,主体内分配的自动对象,即b,首先被销毁。

于 2013-05-27T17:54:20.160 回答
1

您的类可能会通过调用对象数据成员的析构函数来管理未释放的资源。如果是这样,则释放资源的代码属于您编写的析构函数。

例如,如果您使用 分配对象,new则必须使用 释放它们delete。如果您打开一个文件,fopen那么它会以 . 关闭fclose。如果您使用 Posix 互斥锁,pthread_mutex_lock则必须使用pthread_mutex_unlock.

对于释放您(或其他人)的每种资源需求,可以编写一个类来管理和释放该资源,并提供对其基本操作的访问。std::unique_ptr因此存在诸如, std::shared_ptr, std::lock_guard,之类的类std::fstream。当然,为简单起见,您通常希望只有一个类来管理特定类型的资源。因此,由于std::lock_guard存在于 C++11 中,您编写自己的类来释放互斥锁的唯一原因是您提供了一些替代标准接口的接口。理想情况下,具有非默认析构函数的类在您自己的代码中应该很少见——通常已经存在可以用作数据成员或自动变量的类,并且它们的析构函数可以完成这项工作。

于 2013-05-27T18:03:18.727 回答
0

这可能会帮助你

假设一个类有一些动态创建的 someClass 数组。在您的构造函数中假设您创建了

someClass * p = new someClass [10] ;

然后在析构函数中你会写

delete []p ;
于 2013-05-27T17:55:51.520 回答