我有以下简单的代码,我还没有找到一个使用智能指针来处理这种简单情况的线程,而是复制对象:
这会导致指针超出作用域时出现
另一种选择是如果我有i的副本,那么就不会出现上述错误:
这里使用智能指针的优势是什么,我不想执行本地拷贝?
如果我使用原始指针:
int main()
{
int i = 1;
std::unique_ptr<int> p1(&i);
*p1 = 2;
return 0;
}
这会导致指针超出作用域时出现
_BLOCK_TYPE_IS_INVALID
错误。如果我调用p1.release()
,代码就可以正常工作,我就不会遇到这个错误。我以为这样的指针足够智能,可以处理悬空指针?另一种选择是如果我有i的副本,那么就不会出现上述错误:
std::unique_ptr<int> p1(new int(i));
这里使用智能指针的优势是什么,我不想执行本地拷贝?
如果我使用原始指针:
int i = 1;
int *p1 = &i;
*p1 = 2;
即使我不写代码,也不会出现错误:
p1 = nullptr;
=
为unique_ptr
赋值,基本上相当于调用reset
,并销毁先前持有的指针。使用release
放弃指针的所有权,但不销毁它。 - qxzp1=nullptr
是一种赋值方式,p1 应该清理其指针并持有 nullptr。这是所有者需要做的。p1.release()
是为了放弃其“所有权”,将其持有的指针返回给其他人,并停止进行管理,因此不会对其进行清理。 - Chen OT