検索

ホームページ  >  に質問  >  本文

c++ - 把一个指向数组的指针delete[]之后,赋值成为指向另一个更长的数组,然后delete[] 这个指针,是否会造成内存泄漏

int _tmain(int argc, _TCHAR* argv[])
{
    int* p = new int[3]{1, 2, 3};
    int* k = new int[4]{6, 7, 8, 9};

    delete[] p;
    p = k;
    delete[] p;//此处是否会造成内存泄漏?

    return 0;
}

意思就是说,p初始化时指向的是一个长度为3的数组,而p后来指向了k,那么此时再delete[] p的话,是释放3个单位空间还是4个单位空间?假如只释放3个单位,那就内存泄漏了。
或者换一种说法: delete[] 总要知道需要释放的长度吧。这个长度信息,是跟指针p绑在一起的还是和指针指向的这片地址空间绑在一起的?
如果我是语言设计者的话,我会选择后者,不知我想的对不对。

ringa_leeringa_lee2804日前625

全員に返信(3)返信します

  • PHP中文网

    PHP中文网2017-04-17 14:26:22

    いいえ、新規作成と削除はヒープ上のメモリを処理します。通常、ヒープの管理メソッドは、適用されるメモリの前にこのメモリに関する情報 (長さなど) を追加するため、新規作成時に指定する必要があります。削除する場合、長さは必要ありません。単一か配列かを指定するだけです。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:26:22

    いいえ、特定の長さとその他の情報、およびポインターとの関係はすべてコンパイラーとオペレーティング システムによって完成されるため、プログラマーは基礎となる実装について気にする必要はありません。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:26:22

    メモリリークは発生しません。
    p は長さ 3 の配列を指すように初期化してから、長さ 4 の配列を指します。以前に削除操作を実行しているため、メモリ リークは発生しません。ここで宣言されたポインタ p はスタックに格納され、新しいポインタはヒープに格納されます。 p に格納されるのは、宣言した配列のアドレスです。ヒープを解放するには削除を使用する必要があります。解放しないとメモリ リークが発生します。
    Delete では、配列の特定の長さを知る必要はありません。配列であるかどうかに応じて、delete または delete[] を選択するだけです。

    返事
    0
  • キャンセル返事