调用reset时,unique_ptr与数组崩溃

时间:2015-10-04 13:55:32

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

有人可以在这里解释崩溃吗?

#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未被删除,因此该工作正常。这里发生了什么?

1 个答案:

答案 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

你会得到完全相同的错误。永远不要将智能指针与非动态对象一起使用。