
こんにちは。
C++言語において、動的なメモリの割り当てを行うために、new演算子がありますが、
char *p;
p=new char;
とした場合と、
char *p;
p=new char[80];
とした場合、何が異なるのでしょうか?
pに1次元配列を割り当てる場合は、後者の方が正しいと思うのですが、
どちらの場合も、pはchar型の1次元配列として扱う事ができました。
ただ、それはたまたまだったのかもしれないので、きちんと理解しておきたいと思います。
何か御存じの方がいらっしゃれば、是非アドバイスを頂きたいと思います。
では、よろしくお願い致します。
No.5ベストアンサー
- 回答日時:
横道に逸れますが、後学の為に。
># new char[1]やnew char[0]の時は…どうなるんだ?<未検証
new []した物をdelete []せずにdeleteした場合、先頭の1要素に対してのみしかデストラクタが呼ばれません。
delete[]した場合は、すべての要素に対してデストラクタが呼ばれます(要素が100個あればデストラクタが100回呼ばれる)
なので、new char[1]した物の場合、delete []とdeleteは、同じ動作(先頭の1要素に対してのみデストラクタを呼ぶ)をしますので、問題は起きません。
一応、new[]したらdelete[]しないとなりませんが、デストラクタの定義が無い単純変数の配列を開放する場合、delete[]しないでdeleteしちゃっても、問題は起きません(けど、なるべく、仕様には従うべき)
また、要素数を0個にしたnewは、要素数が0個の配列を返すので、delete、delete[]共に、デストラクタは呼ばれず、メモリの開放のみが行われます(と言う仕様になっている筈だが、コンパイラによっては、new [0]がNULLを返しやがる事がある。要素数0個の配列にはアクセスしてはいけないからnewしてもdeleteしか出来ないので、事実上、問題は起きないが)
御丁寧にありがとうございます。
>new []した物をdelete []せずにdeleteした場合、先頭の1要素に対してのみしかデストラクタが呼ばれません。
それは知りませんでした。
だから、
char *p;
p=new char[80];
の場合で、
delete p;
としても、エラーにならなかったのですね。
すっきりしました。
No.3
- 回答日時:
因みに
p[0]
のように「pを1次元配列のように記述する」って話と「pが指す先に、何個分のcharがあるか?」って話は「まったく関係ない話」なので、注意しましょう。
pが指す先にメモリがあろうがなかろうが、p[0]のような記述は「いつでも可能」です。
No.1
- 回答日時:
>何が異なるのでしょうか?
「そこに、何個分のcharがあるか?」だけが違います。
p=new char;
とした場合、pが指すメモリには、charが1個分しかありません。
2番目以降を読み書きしようとすると、場合によっては「不正なメモリアクセス」でプログラムが停止したり、他の変数の値を壊します。
p=new char[80];
とした場合、pが指すメモリには、charが80個分しかありません。
81番目以降を読み書きしようとすると、場合によっては「不正なメモリアクセス」でプログラムが停止したり、他の変数の値を壊します。
このように「1個か80個かの違いがあるだけ」で、他は何も違いません。
つまり
p=new char;
は
p=new char[1];
と同じです。
p=new char[1];
と
p=new char[80];
の違いを比べれば「1個か80個かの違いがあるだけで、他は何も違わない」のは明白です。
御回答ありがとうございます。
なるほど、p=new char は p=new char[1] と同じなのですね。
よーく分かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# C言語 少しの疑問 4 2022/11/08 02:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# Cの関数の引数のconst *charについて 5 2023/04/25 13:05
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fstream型オブジェクトを関数の...
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
fread()関数とfwrite()関数につ...
-
new charとnew char[N]の違いは?
-
全体をNULLクリアするより、最...
-
char型にint型の数値を代入する。
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
文字列置換のアルゴリズムを教...
-
'\\0'とはなんですか?
-
動的メモリの初期化方法について。
-
コマンドライン引数 *argv[]は...
-
csvファイルを構造体に格納した...
-
C++17で、unsigned char * 配列...
-
C言語を用いた環境変数の作成/...
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
Run-Time Check Failure #3とい...
-
先頭アドレスとは何ですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
char型にint型の数値を代入する。
-
C言語にて構造体のメンバがNULL...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
C++17で、unsigned char * 配列...
-
DWORDとcharの変換
-
文字列内の数字削除
-
new charとnew char[N]の違いは?
-
文字型配列に格納した空白の切捨て
-
C++Builder 2009 テキスト...
-
csvファイルをfscanfで読み込む...
-
文字列の途中から途中までを抽出
-
[C] 構造体メンバーのカンマ区...
-
エクセルのMID関数は、C言語では?
-
小数点入りの文字列をfloat型に...
-
wsprintf( ポインタ , "%d" , "...
おすすめ情報