質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1671閲覧

[C++]new[]について

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2014/12/09 05:15

いつもお世話になっております。
初歩的な質問になると思いますが、new[]で確保した場合、確保先のメモリには配列のサイズ情報が必ずセットで存在しているのでしょうか?つまりnew[1]の場合でも [1][memory] みたいになっているのでしょうか?
delete[]の動作は、そのサイズ情報を読んだ後にサイズ回、確保先のメモリをdeleteすると読んだので気になりました。
というのも、自分はその記事を読むまでnew[]で確保した後もdeleteする対象が配列か、そうでないかで場合分けして(new[]するからには、new[size]のsizeがどこかにあるはずなのでそれを記憶用の変数に残しておいて調べる)、deleteとdelete[]を使い分けるようにしていたので、それが間違っているということになるからです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

正しくdeleteするためには、newでメモリ確保した時の情報を「どこかに」記録しておく必要があります。

ただし、規格上その情報を取得する方法はありませんので、newしたメモリの近所にあるのか、もしくは内部で別に持つテーブルで管理しているのか、はたまたOS任せの管理なのかは、使う環境によって異なってきます。

なお、delete[]演算子に要素数を与えても、無視されるだけで意味がありません。

投稿2014/12/09 05:41

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2014/12/09 06:52

わざわざ回答していただいたところに大変申し訳ないのですが、 「delete[]における[]内のサイズ指定をしたいので、new[]時のサイズ情報を知りたい」 という質問ではなく、簡潔にいうと、 「たとえばnew[1]したときはdelete、new[size](size > 1 )のときはdelete[]と使い分けていたのですがその必要はないのですか?」 という内容でした。「delete[]の動作~」はそう思った理由ですね。delete[]の使い方は大丈夫です。 自分の質問の仕方が分かりにくい書き方だったでしょうか。
maisumakun

2014/12/09 07:00

むしろ、「new[]したものを[]なしでdeleteする」という発想自体がなかったです。mallocにはfree、newにはdelete、new[]にはdelete[]と、対応するものできっちり破棄しないとメモリリークの原因になります。
退会済みユーザー

退会済みユーザー

2014/12/09 08:33

new[]には当然new[1]も選択肢に入りますし、「単体をdeleteするのがdelete、配列のような複数の塊をdeleteするのがdelete[]」と習っていたもので。 なので記事を読んで、まちがいに気付けたのは幸いでした。つまりnew[]ならdelete[]は例外なくそうであるってことでいいんですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問