我有一个名为 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 与您的类匹配的情况下,将调用默认的构造函数。

您有两个选择:

  • 也重载。
  • 从管理复制/克隆部分的非模板化基类派生模板(可能 protected )。这通常会更好,因为您有一个管理“根”成员的类。

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

    关于c++ - 如何防止复制省略?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20949682/

    10-09 13:37