在下面的代码中,x(原始pinter)和p(唯一指针)都指向变量a;因此,值“a”的更改反映了两个指针的取消引用。我知道“p”拥有&a的所有权。我试图理解指针超出作用域时的行为,哪个指针最先被释放?我如何避免双重释放?
#include <iostream>
#include <memory>
int main() {
int a = 5;
int *x = &a;
std::unique_ptr<int> p(&a);
*p = 6;
std::cout<< *x << *p <<'\n';
// prints 66
*x =7;
std::cout <<*x <<*p <<"\n";
// 77
std::cout << "Done!"<<'\n';
}附注:我得到这个运行时错误“释放的指针没有被分配”
发布于 2019-07-22 02:28:36
std::unique_ptr<int> p(&a);只是一个bug,因为a是一个自动变量,当它超出作用域时,它将被销毁。您刚刚创建了一种情况,在这种情况下,unique_ptr也会尝试销毁同一对象。不要那样做。
您似乎认为,如果您形成一个现有对象的unique_ptr,那么新的unique_ptr将独占该对象。这是错误的。
另外,原始指针在被销毁时不会删除它们所指向的内容。这与你的原始指针无关。
https://stackoverflow.com/questions/57135892
复制相似问题