简单的unique_ptr问题

时间:2013-06-06 11:36:24

标签: c++ c++11

std::unique_ptr<std::string> foo_ptr(new std::string("foo"));
foo_ptr.reset(foo_ptr.get());
std::cout << *foo_ptr << std::endl; //prints "foo" so obj hasn't been deleted
//runtime error: "pointer being freed was not allocated"

为什么我会收到运行时错误,这只是“foo”被打印出来的巧合?

2 个答案:

答案 0 :(得分:7)

来自n3376的报价20.7.1.2.5 / 4和5。

效果:将p分配给存储的指针,然后如果存储的指针old_p的旧值不是  等于nullptr,调用get_deleter()(old_p)。

[注意:这些操作的顺序很重要  因为调用get_deleter()可能会破坏* this。 - 结束说明]

因此,取消引用此指针会导致未定义的行为。

后置条件:get()== p。 [注意:如果调用get_deleter(),则后置条件不成立 因为这个 - &gt; get()不再是一个有效的表达式,所以要销毁* this。 - 尾注]

答案 1 :(得分:3)

foo_ptr.reset(foo_ptr.get());

此行将“释放”foo_ptr中的当前指针,并将其设置为foo_ptr.get()的值。由于在更新值之前获取了foo_ptr.get(),因此它指向旧位置。

不要这样做。它导致未定义的行为。您永远不应该使用与现有值相同的值来呼叫reset