当我有一个包含指针作为成员变量的课程时,如果我不想使用普通指针,应该有哪种类型的智能指针?它们不需要共享(因此无需共享_ptr)。 scoped_ptr无法正常工作,因为我经常需要在初始化列表之外构建对象。

还是在创建过程中使用Scoped_ptr的常见惯例可能仍然会失败(例外等),然后将它们分配给普通指针?

有帮助吗?

解决方案

如果您只想将成员指针存储在智能指针类型类中,以免/不会忘记删除它们,那么标准选择将是 auto_ptr. 。它在STL中,很容易与 reset() 当您需要释放分配给它的当前内存并用新对象替换它时,功能。

您仍然需要为具有auto_ptr成员的类实现自己的复制构造函数和分配运算符。这是由于以下事实:auto_ptrs分配运算符转移基础对象的所有权,因此默认分配运算符将无法产生您想要的效果。

这是班级可能的样子:

class X
{
public:
    X() :p(new ClassToManage) {}
    X(const X &copy)
        :p(new ClassToManage(*copy.p))
    {
    }

    X &operator=(const X &rhs)
    { 
        this->p.reset(new ClassToManage(*rhs.p));   
    }   

private:
    std::auto_ptr<ClassToManage> p;
};

对于所有其他情况,我建议 boost::shared_ptr. 。 shared_ptr确实确实参考计数,但您可以将它们存储在标准容器中,从而使其非常有用。

您最终应该尝试摆脱使用普通指针的任何指向分配记忆的任何东西。如果您想使用普通的指针来访问或迭代普通的ole数组等,那很好(但是问问自己为什么不使用std :: vector),但是当您使用它们指向某些东西时它负责释放,然后您要麻烦。我编写代码时的目标是没有明确的删除。

其他提示

您可以使用 std::auto_ptr, ,它可以在TR1之前获得,因此您的代码不取决于支持TR1-SmartPointers的编译器。

通常我使用deep_copy_ptr。现在,我知道这样做的Loki Smart_ptr和Axter Smart Pointer。它允许在正常的成员变量(您不需要定义特殊任务操作员/复制构造函数)上自动复制指针类。

我认为您不必在初始化器列表中专门将其专门初始化(但是像普通指针一样,如果没有有效的值,请不要使用它)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top