C++にて要素数が不定の配列のクラスをnewで生成します。
このとき、newで一度に全ての配列を生成するとメモリをかなり取るので、
指定された要素番号のみを生成したいのでダブルポインタにし、
全体を生成してから個別にクラスを生成することで、
思い通りの処理ができるようになりました。
(生成する番号は0→1→2みたいな順列ではないため)
しかし、ここで1つ問題が発生しました。
まずは以下にそのソースを示します。
-----------------------------
class CHOGE {
inta;
public:
CHOGE(){ a=999; }
void print(){ cout<<a<<endl; }
};
-----------------------------
void main(){
CHOGE **p = new CHOGE*[3];
if( p[0] != NULL ){ // ←条件を通過してしまう
cout << "ほげ~" << endl; // ←表示される
//p[0]->print(); // ←当然エラー
}
p[0] = new CHOGE();
p[0]->print(); // ←OK
delete p[0];
p[0] = NULL;
delete [] p;
p = NULL;
}
-----------------------------
上記は3個の要素の配列を生成してから、
個別に0番目の要素のインスタンスを生成しています。
しかし、上記main関数の3行目では、
インスタンスはまだ生成していなにもかかわらず
NULLチェックを通り過ぎてしまいます。
そこで上記main関数の2行目に
for(int i=0; i<3; i++) p[i] = NULL;
という処理を入れると期待通りに動いてくれるのですが、
どうも引っかかるといいますか、何かの情報を消してしまったり
やってはいけないことをやってそうで、不安なのです・・・。
上記のようなとき、NULLを代入しても大丈夫なのでしょうか?
No.2ベストアンサー
- 回答日時:
> 上記のようなとき、NULLを代入しても大丈夫なのでしょうか?
大丈夫です。
ところで、
p[0] = new CHOGE();
または
p[0]->print(); // ←OK
に失敗して例外が送出された場合、このプログラムではメモリリークが発生します。
pは、newで割り付けるより、std::vectorを使うなどした方が安全です。
No.4
- 回答日時:
いや,
CHOGE **p = new CHOGE*[3];
をやったあとで p[0] に入っているゴミが NULL じゃなかった, ということではないかな>#1.
ここに入っていた値はただのゴミなので NULL を代入するのは問題ありません.
No.3
- 回答日時:
動的確保の
CHOGE **p = new CHOGE*[3];
は,静的確保にすると
CHOGE *p[3];
と,同じことですね.
CHOGEへのポインタを3つ含む配列が確保されていますが
C++言語の場合,領域を確保するときに初期化を行わないので
配列のそれぞれの要素が何を指しているかは不定です.
ポインタ自体は3つ確保されているのでそこにNULLを代入しても問題ないですよ.
No.1
- 回答日時:
>CHOGE **p = new CHOGE*[3];
この時点で p[3] で確保されるからnullではない、というオチじゃない?
分解すると こうだよね?
CHOGE **p = {CHOGE*[0],CHOGE*[1],CHOGE*[2]}
よって
p[0]=&(CHOGE*[0]);
p[1]=&(CHOGE*[1]);
p[2]=&(CHOGE*[2]);
だからnullじゃないのでは・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Java Java 配列<選挙> 4 2023/07/31 15:07
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名(配列)の中の変数
-
if文条件式で配列を使用したい
-
perl このテキストファイルを簡...
-
VBAのautofilter、criteriaの配...
-
perl 配列名変数指定するには
-
newで個別に生成した配列にNULL...
-
英語でのシャープとコメの呼び...
-
UWSCの終了の仕方
-
pythonでファイルのコメント行...
-
プログラミングについて。 1つ...
-
javaのループ処理の結果を足し...
-
OSもどきを作りたいです(OSで...
-
画面を強制的に再描画させる方法
-
VBA for文が止まらない
-
非共通要素を抜き出す
-
ネットワークループとルーティ...
-
CASL2のアセンブリ(?)で質問...
-
うるう年判定のアルゴリズム
-
C言語の関数ポインタのイメージ...
-
VBA エクセル2010 横長データ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
Strawberry Perl for Windows ...
-
リストボックスに縦スクロール...
-
二次元配列のインデックスについて
-
文字の整列(printf)
-
エクセルVBAでTransposeの不思議
-
クラスに配列を渡す方法
-
二次元配列における要素数のは...
-
Excel VBA ユーザーフォームの...
-
perlで配列の要素が空なのを知...
-
perlで2次元配列をサブルーチ...
-
マクロ Publicでの配列定義
-
Dim flag(4) as boolean で配列...
-
参照配列の要素数の求め方は?
-
チェックボックスのperlでの値...
-
VB6で配列の最大値を簡単に求め...
-
jcode->jfold で禁則処理
-
DataGridViewに配列の値を表示...
-
VBScript 配列
-
配列を使わずに、数字(連番)...
おすすめ情報