gpt4 book ai didi

c++ - 哪些是类成员变量的非共享智能指针

转载 作者:行者123 更新时间:2023-11-30 01:30:54 25 4
gpt4 key购买 nike

当我有一个包含指针作为成员变量的类时,如果我不想使用普通指针,它们应该具有什么类型的智能指针?它们不需要共享(因此不需要 shared_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),但是当您使用它们指向某些东西时它负责释放然后你自找麻烦。我在编写代码时的目标是没有明确的删除。

关于c++ - 哪些是类成员变量的非共享智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com