【发布时间】:2015-10-04 23:37:29
【问题描述】:
这是一个基本问题,但我没有找到以前的帖子。以下问题的标题听起来可能和我的问题一样,但问题本身与标题不符:is it better to use shared_ptr.reset or operator =?
我对@987654323@ 的reset() 成员函数的用途感到困惑:除了赋值运算符之外,它还有什么作用?
具体来说,给出定义:
auto p = std::make_shared<int>(1);
-
以下两行是否等效:
p = std::make_shared<int>(5); p.reset(new int(5)); -
这些呢:
p = nullptr; p.reset();
如果这两行在两种情况下都是等价的,那么reset()的目的是什么?
编辑:让我重新措辞这个问题以更好地强调它的观点。问题是:有没有一种情况,reset() 让我们实现了没有它就不容易实现的事情?
【问题讨论】:
-
@MeirGoldenberg,在
shared_ptr上调用reset会将托管对象更改为由指针提供的对象,并且它不应该由任何其他shared_ptr拥有。而operator=意味着与另一个shared_ptr共享所有权(当然,除非您正在执行移动分配)。 -
“不应该被拥有”?这是强制执行的还是只是一个协议?如果这个评论连同一个例子成为一个完整的回复,那就太好了。
-
这归结为从原始指针构造
shared_ptr和使用make_shared之间的区别,这应该很容易找出。提示:存在差异,有时可能很重要。 -
@MeirGoldenberg,它由未定义的行为强制执行(如果您可以考虑“强制执行”)。考虑一下如果你
newed 了一些内存并在两个不同的shared_ptrs 上调用reset会发生什么?当两者超出范围时,他们会尝试删除同一个块 - 因此是 UB。 -
@UlrichEckhardt 在这两种情况下我都可以使用原始指针:
p = std::shared_ptr<int>(new int(5));和p.reset(new int(5));原样。现在有什么不同?
标签: c++ c++11 shared-ptr