如何防止复制遗漏

How can I prevent copy elision?

本文关键字:复制 何防止      更新时间:2023-10-16

我有一个名为sfract的类,它存储指向二叉树根节点的指针。显然,在复制构造sfract时,我需要克隆另一个sfract对象的二叉树。但是,复制构造函数永远不会被调用,我认为是因为复制省略。这会导致两个sfract对象在解构时引用并尝试解除分配相同的根节点。如何防止这种情况发生?

//main.cpp
sfract_type a( /*...*/ );
sfract_type b( /*...*/ );
sfract_type c( a ); // copy construct
//sfract.h
template< class FType, class Alloc >
sfract( sfract< FType, Alloc > const & other )
{
    // Clone other's root node and assign to this object
    root = other.root->clone();
}

我看不到您的代码,但是您的模板化构造函数不会优先于默认的复制构造函数,因此在FType和Alloc与您的类匹配的情况下,将调用默认的构造函数。

您有两种选择:

  1. 也超载了。
  2. 从管理复制/克隆部分的非模板化基类派生模板(可能受保护)。这通常更好,因为您有一个类来管理"根"成员。

当然,因为您正在重载复制构造函数,因此请确保您的赋值运算符(以及析构函数)也得到了正确处理。