1

考虑这段代码:

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

4

2 回答 2

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();
于 2012-02-23T15:24:50.127 回答
0

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

于 2012-02-23T15:26:30.623 回答