1
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”被打印出来只是巧合吗?

4

2 回答 2

7

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

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

[ 注意:这些操作的顺序很重要,因为对 get_deleter() 的调用可能会破坏 *this。——尾注]

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

后置条件:get() == p。[ 注意:如果对 get_deleter() 的调用破坏了 *this,则后置条件不成立,因为 this->get() 不再是有效的表达式。——尾注]

于 2013-06-06T11:40:49.217 回答
3
foo_ptr.reset(foo_ptr.get());

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

不要这样做。它会导致未定义的行为。你永远不应该reset使用与它已经拥有的相同的值来调用。

于 2013-06-06T11:40:08.283 回答