C++ 调用reset时阵列崩溃的唯一\u ptr

C++ 调用reset时阵列崩溃的唯一\u ptr,c++,c++11,unique-ptr,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() << '\

有人能解释一下这里的车祸吗

#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?
}
#包括
#包括
int main(){
int*num1=新int(5),*num2=新int(18);
std::unique_ptr numptr=std::unique_ptr(num1);

std::cout将
unique_ptr
包装在一个数组周围,该数组具有自动存储持续时间,其内存将由运行时释放。在程序结束时,
unique_ptr
尝试释放相同的内存。基本上,
u.reset(b);
行相当于
delete[]a;//然后将u设置为指向b

如果你尝试一个简单的程序,比如

int main()
{
    int arr[10];
    delete[] arr; // runtime error here
}

您将得到完全相同的错误。您不应该对非动态对象使用智能指针。

您将
unique\u ptr
包装在一个数组周围,该数组具有自动存储持续时间,其内存将在运行时释放。在程序结束时,
unique\u ptr
尝试释放相同的内存。基本上,line
u.reset(b);
相当于
delete[]a;//然后将u设置为指向b

如果你尝试一个简单的程序,比如

int main()
{
    int arr[10];
    delete[] arr; // runtime error here
}

您将得到完全相同的错误。您不应该对非动态对象使用智能指针。

您将
unique\u ptr
包装在一个数组周围,该数组具有自动存储持续时间,其内存将在运行时释放。在程序结束时,
unique\u ptr
尝试释放相同的内存。基本上,line
u.reset(b);
相当于
delete[]a;//然后将u设置为指向b

如果你尝试一个简单的程序,比如

int main()
{
    int arr[10];
    delete[] arr; // runtime error here
}

您将得到完全相同的错误。您不应该对非动态对象使用智能指针。

您将
unique\u ptr
包装在一个数组周围,该数组具有自动存储持续时间,其内存将在运行时释放。在程序结束时,
unique\u ptr
尝试释放相同的内存。基本上,line
u.reset(b);
相当于
delete[]a;//然后将u设置为指向b

如果你尝试一个简单的程序,比如

int main()
{
    int arr[10];
    delete[] arr; // runtime error here
}

您将得到完全相同的错误。您不应该对非动态对象使用智能指针。

unique\u ptr
只能管理动态分配的对象。
a
b
都不是其中之一。那么上面的
u
做什么呢?
std::unique\u ptr
假设它持有的哑指针已分配在具有
new
new[]
的堆上。在其析构函数或
reset()
中,它尝试
delete
delete[]
所说的指针。相反,您向它提供堆栈上自动对象的地址。这会导致未定义的行为。
unique\u ptr
只能管理动态分配的对象。
a
b
都不是其中之一。那么上面的
u
做什么呢?
std::unique\u ptr
假设为哑指针它在堆上用
new
new[]
分配。在其析构函数或
reset()
中,它尝试
delete
delete[]
所说的指针。相反,您向它提供堆栈上自动对象的地址。这会导致未定义的行为。
unique\u ptr
只能管理动态分配的对象。
a
b
都不是其中之一。那么上面的
u
做什么呢?
std::unique\u ptr
假设为哑指针它在堆上用
new
new[]
分配。在其析构函数或
reset()
中,它尝试
delete
delete[]
所说的指针。相反,您向它提供堆栈上自动对象的地址。这会导致未定义的行为。
unique\u ptr
只能管理动态分配的对象。
a
b
都不是其中之一。那么上面的
u
做什么呢?
std::unique\u ptr
假设为哑指针它通过
new
new[]
在堆上分配。在其析构函数或
reset()
中,它尝试
delete
delete[]
所述指针。相反,您向它提供堆栈上自动对象的地址。它会导致未定义的行为。