以下代码会导致运行时错误。显然当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;
}
答案 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;
}