14527

[code]

    int *a =new int[10];
    
[/code]

ここでは数字が必要ですが

[code]

    delete[] a;
    
[/code]

どうしてここでは数字が必要ないのですか


CC BY-SA 3.0
2015-08-17T09:58:53.173
14524
2015-08-18T05:17:25.607
10945
question
c++
delete[] a; どうしてdelete[]←ここに値がないのに配列を廃棄できるのですか


初期の [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") では `delete[10] a;`
のように要素数が必要だったんです。  
だけどそれではあまりに使いづらいということで `delete[] a;` と書けるように工夫がされました。

よくある実装では `new[]` の際に何個確保したかを同時に記憶しておく手法がとられます。  
`new int [10]` に対して、実際に確保される記憶域は

[code]

    struct intarray {
        size_t count_of_elements;
        int body[10];
    };
    
[/code]

(および必要なら境界整合のための padding 分をさらに追加し)

`new[]` は内部で `p=malloc(sizeof (intarray))` した上で  
\- `p->count_of_elements` に要素数(この例では `10` )を記憶する  
\- `&(p->body[0])` を返却する

`delete[]` は逆の動作、つまり  
\- `&(p->body[0])` から `p` を逆算し  
\- `p->count_of_elements` から要素数を引き出す

これによりめでたく `new[]` で確保した要素数がオブジェクト自体に記憶されるようになりました。  
オブジェクト自体が自分の要素数を知っていれば `delete[]` の際に要素数の指定は不要です。

~~まあ[c++14](/questions/tagged/c%2b%2b14 "'c++14' のタグが付いた質問を表示") では 要素数を明示指定する
`delete[]` も増えるんですけど。~~  
[c++14](/questions/tagged/c%2b%2b14 "'c++14' のタグが付いた質問を表示") では要素数を明示指定する
`operator delete[]` が増えてますけど  
これは `delete[]` を使う側にはあまり関係ない話かな・・・


CC BY-SA 3.0
2015-08-17T11:13:16.853
14527
2015-08-18T05:17:25.607
2015-08-18T05:17:25.607
8589
8589
14524
answer


<http://faithandbrave.hateblo.jp/entry/20120224/1330058808>

処理系依存ですがこういうことですね。  
VC では試していませんが GCC と Clang では配列の先頭要素の直前に要素数が入っているようです。


CC BY-SA 3.0
2015-08-17T11:19:37.380
14528
2015-08-17T11:19:37.380
2748
14524
answer