unique_ptr始终指向相同的内存区域

Ram*_*uri 1 c++ unique-ptr

考虑以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

arr1和arr2指向相同的内存区域.所以他们分享相同的价值观.当我调用arr2 = get()时,我不明白为什么:

unique_ptr<int> p (new int[4]);
Run Code Online (Sandbox Code Playgroud)

不应该再次创建此对象?它不会被删除,因为仍然可以通过arr1访问.如何获得两个不同内存区域的数组?

111*_*111 5

我很确定你正在玩未定义的行为,这很糟糕.

当唯一指针被销毁时,指向的数据被销毁,值是相同的,并且选择相同的槽是运气.

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

std::vector<int> get()
{
    return std::vector<int>(4);
}

int main()
{ 
    std::vector<int> arr1=get();
    std::vector<int> arr2=get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于普通单值指针,则可以返回unique_ptr;

std::unique_ptr<int> get(){
    return std::unique_ptr<int>(new int(0));
}
:::
std::unique_ptr<int> ptr=get();
Run Code Online (Sandbox Code Playgroud)

  • 另外,`std :: unique_ptr`比`std :: auto_ptr`要聪明得多,现在是为数组类型定义的......只要你使用数组类型,例如`unique_ptr <int []>`. (2认同)