我喜欢std::unique_ptr。它可以帮助我防止内存泄漏,这非常有用。但是有一个问题:不允许复制分配和构造。
尽管这个限制有助于程序员的安全,但它也是相当有限的。如果您使用复制分配和构造来处理以 std::unique_ptr 作为其成员的类,那么您最终会遇到问题。这就是为什么我使用复制构造和分配围绕 unique_ptr 创建了自己的包装器。这是它的复制构造函数:
template<typename T, class Deleter>
PointerSmartSafe<T, Deleter>::PointerSmartSafe(PointerSmartSafe const& pointer_smart_safe_) noexcept : _m_opPointerUnique((_m_opPointerUnique == nullptr) ? new T(*_m_opPointerUnique.get()) : nullptr){
}
这是复制赋值运算符:
template<typename T, class Deleter>
PointerSmartSafe<T, Deleter>& PointerSmartSafe<T, Deleter>::operator=(PointerSmartSafe const& pointer_smart_safe_) noexcept{
_m_opPointerUnique = decltype(_m_opPointerUnique)(new T(*_m_opPointerUnique.get()));
return *this;
}
一切都很好,直到我最终使用抽象基类作为类型(T)。我收到如下错误消息:
error: cannot allocate an object of abstract type 'AbstractBaseClass'
这让我很困惑。是否存在解决方法?