deleteは配列では無く、単体でnewされた物に対して使用し
delete[]は配列でnewされた物に対して使用しますよね、
この時、単体でnewされた物に対してdelete[]は使ってはいけないのでしょうか?
hoge=new int;もhoge=new int[1];
と同じ意味ですし、delete hogeじゃなくて、delete[] hoge;で統一しちゃったりとかしたらダメなんですかね?
C++におけるdelete hoge と delete[] hogeの使い分けについて
Re: C++におけるdelete hoge と delete[] hogeの使い分けについて
そのやり方は言語の規格書に載っていません。よって未定義です。hage さんが書きました:hoge=new int;もhoge=new int[1];
と同じ意味ですし、delete hogeじゃなくて、delete[] hoge;で統一しちゃったりとかしたらダメなんですかね?
同じ意味ととらえてしまう貴方には、なぜ型が存在するのかをちゃんと考えてほしいですね。
配列と配列でないのと一緒にする、という話と同じですから。
written by へにっくす
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: C++におけるdelete hoge と delete[] hogeの使い分けについて
そう言うのが面倒なら、ガベージコレクションのあるJavaやC#を選択されるべきだと思います。
あるいはSTLなどで固めてnewを自分で書かないコーディングを徹底するかですね。
あるいはSTLなどで固めてnewを自分で書かないコーディングを徹底するかですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C++におけるdelete hoge と delete[] hogeの使い分けについて
#include <iostream>
class A {
public:
A() { std::cout << "constructor\n"; }
~A() { std::cout << "desnstructor\n"; }
};
int main()
{
A *p = new A[3];
delete p;
}
実行するとどちらも異常終了します。
new[3] では、コンストラクタを 3つ呼び出します。delete[] では、new[] で
呼び出したのと同じ個数のデストラクタを呼び出さなければなりません。
それが delete だと、デストラクタを 1個しか呼び出しません。
これが delete[] を使わなければならない理由の一つです。
次に、なぜ、プログラムが異常終了するのかを説明します。
delete[] が new[] で確保したインスタンスの個数を知るためには、new[] が
それをどこかに記憶しておかなければなりません。
new[] は、その個数の領域とその個数分のインスタンスの領域を一括して確保し、
確保した領域のアドレスではなく、個数の領域の次のインスタンスの領域の
アドレスを返します。
delete[] は、指定されたアドレスのひとつ前に個数が入っているので、それを
使ってデストラクタをその個数だけ呼び出した後、本当に確保されたアドレスで
すべての領域を解放します。
delete は、指定されたアドレスで解放するので、それは本当に確保された
領域ではないため、異常終了するのです。
Re: C++におけるdelete hoge と delete[] hogeの使い分けについて
deleteとdelete[]ってそんな違いがあったんですね。
有難う御座います。
有難う御座います。
Re: C++におけるdelete hoge と delete[] hogeの使い分けについて
ちょっと補足します。
このプログラムは異常終了しません。
デストラクタがないクラスの場合、個数を記憶する必要がないので、
delete も delete[] も指定したアドレスを解放するだけだからです。
その意味では、質問にあった int の場合、delete も delete[] も
問題なく動くので、それで違いが分からず質問されたのだと思います。
#include <iostream>
class A {
public:
A() { std::cout << "constructor\n"; }
};
int main()
{
A *p = new A[3];
delete p;
}
デストラクタがないクラスの場合、個数を記憶する必要がないので、
delete も delete[] も指定したアドレスを解放するだけだからです。
その意味では、質問にあった int の場合、delete も delete[] も
問題なく動くので、それで違いが分からず質問されたのだと思います。
Re: C++におけるdelete hoge と delete[] hogeの使い分けについて
> 気になったのはこっちです
deleteしなくてはならない配列の要素数が判らなくて困ります。
配列でも配列じゃなくても、常にdelete[](あるいは常にdelete)するような設計も可能だったかもしれませんが、
C++ではそのような文法は採用されませんでした。
# 不採用の理由は、時代的にコンパイラの実装が面倒になるからかな?
# あるいは、プログラマに自由と責任を与えるC言語の方針の踏襲かも。
deleteしなくてはならない配列の要素数が判らなくて困ります。
配列でも配列じゃなくても、常にdelete[](あるいは常にdelete)するような設計も可能だったかもしれませんが、
C++ではそのような文法は採用されませんでした。
# 不採用の理由は、時代的にコンパイラの実装が面倒になるからかな?
# あるいは、プログラマに自由と責任を与えるC言語の方針の踏襲かも。
Re: C++におけるdelete hoge と delete[] hogeの使い分けについて
この場合、デストラクタがないので、個数は不要。hage さんが書きました:気になったのはこっちです
delete も delete[] も同じで、p の指す領域をそのまま解放するだけです。