有人可以在这里解释崩溃吗?
#include <iostream>
#include <memory>
int main() {
int *num1 = new int(5), *num2 = new int(18);
std::unique_ptr<int> numptr = std::unique_ptr<int>(num1);
std::cout << *numptr.get() << '\n'; // 5
numptr.reset(num2);
std::cout << *numptr.get() << '\n'; // 18
int a[5] = {0,2,4,6,8}, b[5] = {0,3,6,9,12};
std::unique_ptr<int[]> u = std::unique_ptr<int[]>(a);
std::cout << u[3] << '\n'; // 6
u.reset(b);
std::cout << u[3] << '\n'; // Crash. Why??? Should output 9, right?
}
使用std::unique_ptr<int>
调用重置时没有崩溃,所以为什么崩溃std::unique_ptr<int[]>
。在我看来,u
取得b
的所有权,然后删除a
。因此,u[3]
应为b[3] = 9
,因为b
未被删除,因此该工作正常。这里发生了什么?
答案 0 :(得分:2)
将 Jan Feb Mar Apr May ...
a 2 4 6 4 1
b 4 1 3 4 0
c 2 2 4 2 0
d 7 3 6 0 5
e 9 5 1 9 8
包裹在一个数组周围,该数组具有自动存储持续时间,其内存将由运行时释放。在程序结束时,unique_ptr
会尝试释放相同的内存。基本上,行unique_ptr
等同于u.reset(b);
。
如果您尝试像
这样的简单程序delete[] a; // then set u to point to b
你会得到完全相同的错误。永远不要将智能指针与非动态对象一起使用。