简单的unique_ptr问题

Simple unique_ptr issue

本文关键字:ptr 问题 unique 简单      更新时间:2023-10-16
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"被打印出来吗?

引用自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()不再是一个有效的表达式。

foo_ptr.reset(foo_ptr.get());

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

不要这样做。这会导致未定义的行为。永远不要用它已经具有的相同值调用reset