考虑以下代码:
using namespace std;
int* get()
{
unique_ptr<int> p (new int[4]);
return p.get();
}
int main(int argc, char **argv)
{
int *arr1=get();
int* arr2=get();
for(int i=0;i<4;i++)
{
arr1[i]=i;
arr2[i]=i*2;
}
for(int i=0;i<4;i++)
cout << arr1[i];
return 0;
}
arr1和arr2指向相同的内存区域。 所以他们分享相同的价值观。 当我调用arr2 = get():
时,我不明白为什么unique_ptr<int> p (new int[4]);
不应再次创建此对象?它不会被删除,因为arr1仍然可以访问它。 如何获得两个不同内存区域的数组?
答案 0 :(得分:5)
我很确定你正在玩未定义的行为,这很糟糕。
当唯一指针被销毁时,指向的数据被销毁,值相同,选择相同的插槽就是运气。
指向数组类型的指针使用向量
std::vector<int> get()
{
return std::vector<int>(4);
}
int main()
{
std::vector<int> arr1=get();
std::vector<int> arr2=get();
return 0;
}
对于普通单值指针,则可以返回unique_ptr;
std::unique_ptr<int> get(){
return std::unique_ptr<int>(new int(0));
}
:::
std::unique_ptr<int> ptr=get();
答案 1 :(得分:0)
智能指针的这种使用存在内存泄漏。 unique_ptr将使用operator delete来释放分配的内存,但是你需要删除[]。此外,get函数的返回值将是无效的ptr,因为unique_ptr将释放分配的区域。如果需要动态分配的数组,请使用std :: vector。