指向相同内存区域的unique_ptr

unique_ptr pointing always to the same memory area

本文关键字:unique ptr 区域 内存      更新时间:2023-10-16

考虑以下代码:

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仍然可以访问。如何获得两个不同内存区域的数组?

我敢肯定你在玩未定义的行为,这很糟糕。

当唯一指针被破坏时,所指向的数据被破坏了,事实上值是相同的,并且选择了相同的插槽是幸运的。

对于指向数组类型的指针,请使用矢量

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();

在这种智能指针的使用中存在内存泄漏。unique_ptr将使用运算符delete来释放分配的内存,但您需要delete[]。此外,get函数的返回值将是一个无效的ptr,因为unique_ptr将释放分配的区域。如果您需要动态分配的数组,那么请使用std::vector。