简单的unique_ptr问题
Simple unique_ptr issue
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
。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 从const ptr*转换为ptr*时出现问题