如何防止复制遗漏
How can I prevent copy elision?
我有一个名为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与您的类匹配的情况下,将调用默认的构造函数。
您有两种选择:
- 也超载了。
- 从管理复制/克隆部分的非模板化基类派生模板(可能受保护)。这通常更好,因为您有一个类来管理"根"成员。
当然,因为您正在重载复制构造函数,因此请确保您的赋值运算符(以及析构函数)也得到了正确处理。
相关文章:
- 防止在复制构造函数中隐式调用基构造函数
- 防止gcc破坏我的AVX2内部复制到REP MOVS
- 如何防止静态库被复制?
- 防止复制构造函数实例化 C++11 类"deleting"
- C++移动分配可防止复制交换习惯用法
- 防止作用域枚举可复制/可移动
- 通过make_shared防止复制构建
- 双重列表复制构造函数:与单一列表复制构造函数有何不同
- 在线程中复制文件以防止冻结应用程序
- 如何防止复制遗漏
- 我可以防止对象被 std::memcpy 复制吗?
- 我可以防止 std::sort 复制传递的比较对象吗?
- 使用 std::move 以防止复制
- 在类的私有部分为复制构造函数定义原型如何防止类的复制
- 如何防止复制蝇量级对象
- 缺少复制构造函数与对象切片有何关系
- 防止编译器在C++03中考虑隐式声明的复制构造函数
- 如何防止对对象进行不必要的复制
- 将移动语义防止复制在这里
- log:当它使用add_file_log()函数时,如何防止输出将被复制到所有添加的流