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でまだ到達可能であるため、削除されません。異なるメモリ領域の2つの配列を取得するにはどうすればよいですか?

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は、割り当てられたメモリを解放するために演算子deleteを使用しますが、delete[]が必要です。また、unique_ptrは割り当てられた領域を解放するため、get関数の戻り値は無効なptrになります。動的に割り当てられた配列が必要な場合は、std::vectorを使用してください。

于 2012-02-23T15:26:30.623 に答える