分配给std::shared_ptr成员变量

12

我有一个名为foo的类,拥有一个类型为std::shared_ptr<int>的成员bar

class foo
{
    std::shared_ptr<int> bar;
    /*other stuff here*/
};

在那个课堂上,我想要为bar分配一个new int。但是我不能写bar = new int();,因为指针没有公共赋值运算符。

我该如何做呢?我可以使用std::movestd::swap,但这两种方法都似乎不太对。

2个回答

14

bar = std::make_shared<int>(); 是其中一种方式,特别是如果您想保留赋值运算符的可追溯性。


зңӢеҲ°дҪ зҡ„зј–иҫ‘дәҶгҖӮиҝҷдёӘжӣҙж”№жҳҜеҗҰд»Қе°ҶintеҲқе§ӢеҢ–дёә0пјҹnew int()дјҡпјҢnew intдёҚдјҡгҖӮ - Bathsheba
2
std::make_shared<int>(new int()) 不是有效的;make_shared 完美转发参数到 T 构造函数。它被指定使用 ::new (pv) T(std::forward<Args>(args)...) 构造对象,所以如果没有参数,它将被值初始化。 - TartanLlama
1
@Bathsheba:没错,make_* 函数没有任何“未初始化”的形式。我记得曾经有一次提出了这样的建议(作为允许为 make_{shared,unique} 使用大小数组类型的提议的一部分),并且该提议还附带了一个使用默认初始化的 make_*_uninitialized 形式。一般来说,标准库很难产生未初始化的值,尽管有时这正是你需要的... - Kerrek SB
你什么时候会需要一个未初始化的值?不用担心微小的性能问题,因为优化器会在发布版本中删除冗余的赋值语句,所以这通常是无关紧要的。我唯一能想到的其他情况是使用工具进行调试,比如valgrind/memcheck或ubsan。 Valgrind有一个API,允许定义整个地址范围为“未初始化”,除了共享int示例之外,还有许多其他用途,并且可以使意图明确。 - Arne Vogel
我并不是这样想的。我只是想确认 @TartanLlama 的编辑是否引入了任何未初始化变量的可能性。他们和 Kerrek SB 的专业知识让我相信这不是问题。 - Bathsheba
显示剩余2条评论

11

你可以使用 reset 来实现:

bar.reset(new int());

这将删除当前内容(如果有的话),并将内部指针设置为new表达式返回的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接