[595] Re:deleteとdelete[]
投稿者:(ぱ)
2007/02/20 02:13:25
> x=new char; とした後、これを開放するときは delete x;
> x=new char[n]; とした後、これを開放するときは delete[] x;
>となっていると思います。
>ところで delete と delete[] はどう違うのでしょうか。
>両者を取り違えると不都合があるのでしょうか。
C++はさして詳しいわけではないのですが。
仕様上はおそらくこの場合の挙動は不定で、「何が起きても文句は言えない」状態だと
思いますが(ちゃんと調べてませんすみません)。
現実問題としてありそうなのは、charのような基本型でなくクラスの配列の場合、
最初のひとつのオブジェクト以外のデストラクタが呼び出されない、ということでしょう。
>また、もちろん
> x=new char[n]; の後の delete[] x; でchar型のn個の領域が開放されますが
>このときのnの値(開放すべきデータのサイズ)は
>メモリのどこに保存されているのでしょうか。
「どこかの管理領域」としか言いようがないですが(管理方法によっては、
サイズを直接保持する必要はないかもしれません)。
動的メモリ確保の挙動については、ポインタ完全制覇の2-6-3あたりを参照して
ください。C++でも、ずっと下の方では、特に変わるものではありません。
逆に言うと、Cと同レベルのメモリ管理機構の上にC++をのっけてしまったから、
プログラマの側が忘れず[]を付けることを強制されているとも言えるでしょう。
>それから
> x=new char[n]; を開放するときは delete x[];
>という人もいますが、これは間違いではないでしょうか。
そもそもそんな書き方ってできましたっけ。
Bjarne本の第3版の構文規則を見ると、
delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression
とありますが…
すみませんどなたか詳しい方の救援をお願いします。