2016-11-02 13 views
4

C++では、配列を割り当てると、配列が初期化された後に配列のサイズを見つける方法がありません。次に、削除オペレータは、プログラム終了時にメモリの割り当てを解除しようとしているときに、削除するメモリ量をどのように知っていますか?C++でアレイを削除しているときにメモリを解放する

int main() 
{ 
    int* p = new int[10]; 
    int* q = new int[30]; 
    //... bunch of code 
    //... 
    // ... bunch of code 
    delete[] p; 
    delete[] q; 
    return 0; 
} 
+0

これは、すべてあなたのコンパイラおよび/またはC++ライブラリによって処理されます。正しいことが起こると言うには十分です。 –

+2

短い答えは「しかしそれが欲しい」です。 –

+0

https://isocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-array – melpomene

答えて

12

newオペレータは、ヒープ上のエントリを作成し終わると、ヒープアロケータは、それが以前に割り当てられています事を割り当て解除する方法を知っています。この情報は通常、あなたのコードでは利用できません。なぜなら、あなたが混乱してはならないC++の内部構造だからです。

したがって、ヒープメタデータは基本的にこの割り当てを記述します。

C++ではwrite your own allocatorとなることがありますので、newとは、必要に応じてインターフェイスになる可能性があります。 std::allocatorがどのように定義されているかを見ると、割り当てが行われたことを誰にも知らせる義務はなく、特定の割り当てがどれくらい大きいかは分かりません。アロケータはここでは膨大な自由度を持っており、この仕様では多くの質問ができません。

+0

アロケータ認識コンテナーコールが実際にはポインタとともにサイズをとるアロケータ特性のdeallocate機能以前の割り当てのサイズを表すと仮定します。したがって、アロケータを一般的に使用するには、ヒープリクエストのサイズをある方法で追跡し、それらを返すという義務があります。だから、それは新しいものや削除するものとはまったく異なっている。 –

関連する問題