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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FORTRAN90で書式に変数を使いたい
-
エクセルVBAでTransposeの不思議
-
組み合わせについての質問です...
-
参照配列の要素数の求め方は?
-
UWSCの終了の仕方
-
vb.netからエクセル関数書き込み
-
DoEventsが必要な理由について
-
UWSCのスクリプトで行き詰って...
-
ループフリー
-
RFC822形式の日付を生成するサ...
-
VBAでのコピーのやり方
-
jQuery を使用した経過時間の表...
-
マクロでの繰り返し作業の書き...
-
不安で苦しくて眠れない夜、ど...
-
アルゴリズムやデータ構造を一...
-
アセンブラによるウェイト(WAIT...
-
VBAで3秒だけ時間を止めたい
-
forループで試行を繰返し、その...
-
テキストファイルの行数を指定...
-
VBA横データを縦にしたいです
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラスに配列を渡す方法
-
エクセルVBAでTransposeの不思議
-
Excel VBA ユーザーフォームの...
-
VBAのautofilter、criteriaの配...
-
Strawberry Perl for Windows ...
-
二次元配列における要素数のは...
-
VB6で配列の最大値を簡単に求め...
-
リストボックスに縦スクロール...
-
文字の整列(printf)
-
ファイル名に日付・時刻を付与...
-
DataGridViewに配列の値を表示...
-
チェックボックスのperlでの値...
-
一致する要素が格納されている...
-
隣同士の数字を足し合わせる
-
perlで配列の要素が空なのを知...
-
条件に一致した塩基配列を含む...
-
perlで2次元配列をサブルーチ...
-
マクロ Publicでの配列定義
-
二次元配列のインデックスについて
-
perl 配列の要素数について
おすすめ情報