当原始指针和唯一指针都引用同一对象时,如何避免双重释放?

Mas*_*deh 0 c++ pointers memory-management

在下面的代码中,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';
}
Run Code Online (Sandbox Code Playgroud)

PS我得到这个运行时错误“指针被释放未分配”

Jes*_*uhl 11

std::unique_ptr<int> p(&a);只是一个错误,因为它a是一个自动变量,当它超出范围时将被销毁。您刚刚创建了一种情况,其中a unique_ptr将尝试破坏同一对象。只是不要那样做。

您似乎假设如果unique_ptr对现有对象形成一个,则新对象unique_ptr将拥有该对象的专有所有权。错了

也; 原始指针在销毁时不会删除它们指向的内容。这与您的原始指针无关