こんにちは。
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
char*を初期化したいのですが
C言語・C++・C#
-
動的メモリの初期化方法について。
C言語・C++・C#
-
既定のコンストラクタがありません。というエラーについて
C言語・C++・C#
-
-
4
TCHAR文字列?の特定部分の数字文字をint型の数値に変える方法
C言語・C++・C#
-
5
クラスのアドレスを引数として渡したい
C言語・C++・C#
-
6
newしないオブジェクトについて
C言語・C++・C#
-
7
VisualStudio2019のコードアナライザでC6386(バッファオーバーラン)エラー
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringからchar*への型変換に...
-
C言語 strstrの実装
-
ASCIIコードへの変換方法
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
fread()関数とfwrite()関数につ...
-
ASCIIコードへの変換方法
-
wsprintf( ポインタ , "%d" , "...
-
小数点入りの文字列をfloat型に...
-
エクセルのMID関数は、C言語では?
-
fstream型オブジェクトを関数の...
-
char AA[]{"全角文字"};から"全...
-
C言語にて構造体のメンバがNULL...
-
C言語でポインターで詰まってい...
-
C言語のintとcharの違いってな...
-
文字列についていい方法はあり...
-
DWORDとcharの変換
-
C言語の文字リテラル中の16進文...
-
動的メモリの初期化方法について。
-
文字の色
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語のプログラムについてです
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
char型にint型の数値を代入する。
-
エクセルのMID関数は、C言語では?
-
fstream型オブジェクトを関数の...
-
動的メモリの初期化方法について。
-
const char* s1とただのchar s1...
-
char 文字列型 の表現範囲が-12...
-
文字列の途中から途中までを抽出
-
strcat関数を自作したいです
-
2次元配列の文字"列"の初期化方法
-
DWORDとcharの変換
-
C言語で文字列をかえす正しい書...
-
szとlpszの違い
-
fgetc( )の戻り値はなぜ整数??
おすすめ情報