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
尝试释放相同的内存。基本上,lineu.reset(b);
相当于delete[]a;//然后将u设置为指向b
如果你尝试一个简单的程序,比如
int main()
{
int arr[10];
delete[] arr; // runtime error here
}
您将得到完全相同的错误。您不应该对非动态对象使用智能指针。您将unique\u ptr
包装在一个数组周围,该数组具有自动存储持续时间,其内存将在运行时释放。在程序结束时,unique\u ptr
尝试释放相同的内存。基本上,lineu.reset(b);
相当于delete[]a;//然后将u设置为指向b
如果你尝试一个简单的程序,比如
int main()
{
int arr[10];
delete[] arr; // runtime error here
}
您将得到完全相同的错误。您不应该对非动态对象使用智能指针。您将unique\u ptr
包装在一个数组周围,该数组具有自动存储持续时间,其内存将在运行时释放。在程序结束时,unique\u ptr
尝试释放相同的内存。基本上,lineu.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[]
所述指针。相反,您向它提供堆栈上自动对象的地址。它会导致未定义的行为。