C++需要析构函数
Posted
技术标签:
【中文标题】C++需要析构函数【英文标题】:C++ need for destructor function 【发布时间】:2013-05-22 14:34:39 【问题描述】:What is The Rule of Three? 提及
在执行析构函数的主体并销毁所有自动对象之后 在主体内分配,类 X 的析构函数调用析构函数 X 的直接 [...] 成员 [n3126.pdf 12.4 §6]
这让我想知道,如果不销毁成员,析构函数有什么用?请举例说明
【问题讨论】:
它在哪里说使用析构函数不是为了破坏成员?? 我认为您链接的问答确实提供了示例 @AlokSave:引用说成员在执行析构函数(的主体)后被销毁。我认为这是一个合理的推论,析构函数(主体)的目的是不是破坏成员。这也是真的。 它还可以关闭套接字、减少引用计数等 你问了一个非常聪明的问题,而且你正在做一些重要的事情。 You can read more 关于适用于析构函数的单一职责原则。 【参考方案1】:会员自己不负责额外的清理工作。或者在资源管理的情况下,确保与对象关联的资源被正确释放。请记住,并非所有成员都有将被调用的析构函数(指针没有析构函数)。因此,如果您有指针,则需要手动管理它们。
使用指针的资源管理示例。
shared_ptr::~shared_ptr()
if (decrementReferenceCountAndCheckForZero())
cleanupResources();
示例。使用框架。没有成员知道框架,但工作人员知道。
MyWorker::MyWorker()
Framwork::Register(this);
MyWorker::~MyWorker()
Framework::Unrigester(this);
【讨论】:
虽然在框架的情况下,为了职责分离,您可能合理地需要一个类FrameworkRegistration
来处理(取消)注册,然后MyWorker
有一个作为数据成员。基本上,Framework::Unregister
不是一个对 C++ 非常友好的接口,但很容易封装在一个对 C++ 友好的接口中。
@SteveJessop:完全同意。只是寻找潜在的例子。【参考方案2】:
一旦对象不再存在,与类实例相关的任何需要解除关联/释放/特殊处理的东西。 几个例子:
由实例打开、拥有和使用的文件句柄,不会在对象销毁后使用。 类实例打开和拥有的套接字、互斥锁等。【讨论】:
【参考方案3】:该语句的所有含义是如果您将析构函数定义为
Foo::~Foo()
Bar b;
b.do_whatever();
然后b
对象的析构函数在Foo
的任何成员的析构函数之前运行。析构函数的主体被执行,主体内分配的自动对象,即b
,首先被销毁。
【讨论】:
【参考方案4】:您的类可能会通过调用对象数据成员的析构函数来管理未释放的资源。如果是这样,则释放资源的代码属于您编写的析构函数。
例如,如果您使用new
分配对象,则必须使用delete
释放它们。如果你用fopen
打开一个文件,那么它就会用fclose
关闭。如果您使用 pthread_mutex_lock
使用 Posix 互斥锁,则必须使用 pthread_mutex_unlock
释放它。
对于释放您(或其他人)的每种资源需求,可以编写一个类来管理和释放该资源,并提供对其基本操作的访问。因此存在像std::unique_ptr
、std::shared_ptr
、std::lock_guard
、std::fstream
这样的类。当然,为简单起见,您通常希望只有一个类来管理特定类型的资源。因此,由于std::lock_guard
存在于 C++11 中,因此您编写自己的类来释放互斥锁的唯一原因是您提供了一些标准接口的替代接口。理想情况下,具有非默认析构函数的类在您自己的代码中应该很少见——通常已经存在可以用作数据成员或自动变量的类,并且它们的析构函数可以完成这项工作。
【讨论】:
【参考方案5】:这可能对你有帮助
假设一个类的数组 someClass 是动态创建的。在您的构造函数中假设您创建了
someClass * p = new someClass [10] ;
然后在析构函数中你会写
delete []p ;
【讨论】:
以上是关于C++需要析构函数的主要内容,如果未能解决你的问题,请参考以下文章