unique_ptr

时间:2016-04-11 09:08:58

标签: c++ c++11 runtime-error unique-ptr

以下代码会导致运行时错误。显然当unique_ptr a超出范围时,它会尝试删除已经删除的内存,因此会导致堆问题。我的问题是我应该在第X行中做哪些更改,因为它们共享相同的内存,即使在使用delete调用后也不会出现任何运行时错误。

#include <iostream>
#include <memory>
using namespace std;
int main () 
{
    int* p = new int (10);
    unique_ptr<int> a (p);   // Line X
    delete p;
    return 0;
}         

2 个答案:

答案 0 :(得分:2)

在第X行,您将p指向的对象的所有权转移到创建的unique_ptr<int> a。您不应该在以后明确删除它,否则您有双重删除错误。

如果你不希望unique_ptr删除它指向的对象,你应该在销毁之前释放它,例如:

int main() {
    int * p = new int(10);
    unique_ptr<int> a(p);
    a.release(); // <--- Release ownership of the integer
    // unique_ptr a no longer "owns" the integer
    delete p;
}

unique_ptr的全部意义在于它“拥有”并反对并以RAII方式释放其资源。

答案 1 :(得分:0)

从C ++ 14开始,您的代码段可以修复如下:

#include <iostream>
#include <memory>
using namespace std;
int main ()
{
    auto a = make_unique<int>(10);   // = unique_ptr<int>(new int(10))
    return 0;
}