0

私の懸念は、配列の割り当てを解除する必要があるかどうかです。次に例を示します。

typedef struct
{
    int *values;
    int length;
} a_struct;

void foo()
{
    a_struct myStruct;
    myStruct.values = new int[NUM];  

    delete[] myStruct.values; // Is this needed?
    return;  
}

私の理解では、myStruct (スタック上にあります) は「return」ステートメントで自動的に削除されます。「値」も削除しますか?

4

4 に答える 4

4

それはpointer の values割り当てを解除しますが、それが指すものは解放しませa_structん。たぶん、スタックに割り当てられたものへのポインタ、または別のものと共有されている配列へのポインタstructです。

したがって、はい、手動で割り当てを解除する必要があります (ただし、最新の C++ では、メモリを管理するために「スマート ポインター」が使用されることがよくあります)。

于 2013-08-23T23:59:52.850 に答える
2

いいえ、そうではありません。手動で削除する必要があります。myStructスコープ外になること (したがって、myStruct.valuesメンバー、つまり無効化されるポインター) は、動的に割り当てられたメモリとは何の関係もありません。ゴールデン ルール: を呼び出す場合はnew[]、常にdelete[]( と についても同じnew) delete

于 2013-08-23T23:59:41.333 に答える
0

何も「削除」されません。スタックがポップされます。限目。構造体にはデストラクタがないため、他に何も起こりません。

于 2013-08-24T01:49:30.590 に答える
0

はい、必要です。構造体は配列のアドレスのみを格納します。最近では、std::vector<> を格納するだけです (または、std::unique_ptr<> への所有ポインタが必要な場合)。

于 2013-08-24T00:06:26.140 に答える