在 "dctor、copy ctor和copy assignment operator "中,为什么删除其中一个而让另一个隐式定义,很可能会导致错误

问题描述 投票:0回答:1

根据文档(https:/en.cppreference.comwcpplanguagerule_of_three。),其中说。

通过可复制句柄管理不可复制资源的类可能必须声明复制分配和复制构造函数是私有的,而不提供它们的定义或将它们定义为删除。这是对三规则的另一种应用:删除一个而让另一个隐式定义,很可能会导致错误。

作为主题,我不知道为什么会出现这种情况,有人能不能更详细的解释一下,有人能不能举个简单的例子说明一下?

c++ c++11 constructor copy-constructor assignment-operator
1个回答
1
投票

答案在前一段。

如果类管理的资源的句柄是一个非类类型的对象(原始指针、POSIX文件描述符等),其destructor什么都不做,copy constructorassignment操作符执行 "浅层复制"(复制句柄的值,而不复制底层资源),那么隐式定义的特殊成员函数通常是不正确的。

三分法则告诉你的是,你希望你所有的特殊成员(copy构造函数、copy赋值操作符和destructor)都以同样的方式定义:隐式、显式或完全不定义。

一个管理不可复制资源的类,通常是一个拥有一些难以复制资源的类。一个例子是 std::filebuf,它管理着一个文件(它由 std::fstream). 它既没有定义一个复制构造函数,也没有定义一个复制赋值操作符:两者都被删除。它确实显式地定义了一个destructor来关闭文件。

现在,如果隐式地定义了destructor,文件将永远不会被关闭,缓冲区将留在内存中,导致内存泄漏。如果复制赋值操作符的复制构造函数被隐式定义,它将复制缓冲区的指针,然后destructor将有可能为同一个文件被多次调用,试图多次删除同一个缓冲区(这是未定义的行为)。

© www.soinside.com 2019 - 2024. All rights reserved.