C++におけるdelete hoge と delete[] hogeの使い分けについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hage

C++におけるdelete hoge と delete[] hogeの使い分けについて

#1

投稿記事 by hage » 4年前

deleteは配列では無く、単体でnewされた物に対して使用し
delete[]は配列でnewされた物に対して使用しますよね、
この時、単体でnewされた物に対してdelete[]は使ってはいけないのでしょうか?
hoge=new int;もhoge=new int[1];
と同じ意味ですし、delete hogeじゃなくて、delete[] hoge;で統一しちゃったりとかしたらダメなんですかね?


hide

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#3

投稿記事 by hide » 4年前

C言語のポインタから見なおしたほうがいいかもしれないですよ。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#4

投稿記事 by へにっくす » 4年前

hage さんが書きました:hoge=new int;もhoge=new int[1];
と同じ意味ですし、delete hogeじゃなくて、delete[] hoge;で統一しちゃったりとかしたらダメなんですかね?
そのやり方は言語の規格書に載っていません。よって未定義です。
同じ意味ととらえてしまう貴方には、なぜ型が存在するのかをちゃんと考えてほしいですね。
配列と配列でないのと一緒にする、という話と同じですから。
written by へにっくす

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#5

投稿記事 by softya(ソフト屋) » 4年前

そう言うのが面倒なら、ガベージコレクションのあるJavaやC#を選択されるべきだと思います。
あるいはSTLなどで固めてnewを自分で書かないコーディングを徹底するかですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#6

投稿記事 by かずま » 4年前

コード:

#include <iostream>
 
class A {
public:
    A() { std::cout << "constructor\n"; }
    ~A() { std::cout << "desnstructor\n"; }
};

int main()
{
    A *p = new A[3];
    delete p;
}
このプログラムは、VC++ でも g++ でもコンパイルできますが、
実行するとどちらも異常終了します。

new[3] では、コンストラクタを 3つ呼び出します。delete[] では、new[] で
呼び出したのと同じ個数のデストラクタを呼び出さなければなりません。

それが delete だと、デストラクタを 1個しか呼び出しません。
これが delete[] を使わなければならない理由の一つです。

次に、なぜ、プログラムが異常終了するのかを説明します。

delete[] が new[] で確保したインスタンスの個数を知るためには、new[] が
それをどこかに記憶しておかなければなりません。

new[] は、その個数の領域とその個数分のインスタンスの領域を一括して確保し、
確保した領域のアドレスではなく、個数の領域の次のインスタンスの領域の
アドレスを返します。

delete[] は、指定されたアドレスのひとつ前に個数が入っているので、それを
使ってデストラクタをその個数だけ呼び出した後、本当に確保されたアドレスで
すべての領域を解放します。

delete は、指定されたアドレスで解放するので、それは本当に確保された
領域ではないため、異常終了するのです。

hage

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#7

投稿記事 by hage » 4年前

deleteとdelete[]ってそんな違いがあったんですね。
有難う御座います。

かずま

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#8

投稿記事 by かずま » 4年前

ちょっと補足します。

コード:

#include <iostream>
 
class A {
public:
    A() { std::cout << "constructor\n"; }
};
 
int main()
{
    A *p = new A[3];
    delete p;
}
このプログラムは異常終了しません。
デストラクタがないクラスの場合、個数を記憶する必要がないので、
delete も delete[] も指定したアドレスを解放するだけだからです。
その意味では、質問にあった int の場合、delete も delete[] も
問題なく動くので、それで違いが分からず質問されたのだと思います。

hage

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#9

投稿記事 by hage » 4年前

コード:

#include <iostream>
 
class A {
public:
    A() { std::cout << "constructor\n"; }
};
 
int main()
{
    A *p = new A;
    delete []p;
}

気になったのはこっちです

たいちう
記事: 418
登録日時: 9年前

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#10

投稿記事 by たいちう » 4年前

> 気になったのはこっちです

deleteしなくてはならない配列の要素数が判らなくて困ります。

配列でも配列じゃなくても、常にdelete[](あるいは常にdelete)するような設計も可能だったかもしれませんが、
C++ではそのような文法は採用されませんでした。

# 不採用の理由は、時代的にコンパイラの実装が面倒になるからかな?
# あるいは、プログラマに自由と責任を与えるC言語の方針の踏襲かも。

かずま

Re: C++におけるdelete hoge と delete[] hogeの使い分けについて

#11

投稿記事 by かずま » 4年前

hage さんが書きました:気になったのはこっちです
この場合、デストラクタがないので、個数は不要。
delete も delete[] も同じで、p の指す領域をそのまま解放するだけです。

閉鎖

“C言語何でも質問掲示板” へ戻る