言葉に囚らわれすぎていて真に聞きたいのは何かわかりにくいけど
1.
class hoge_type { ... };
hoge_type global_hoge; // 俗にいう大域変数
この global_hoge は「不要にならない」=プログラムの起動から終了までずっと存在し続けて、途中で処分できない。
例えば Windows であれば名前付き mutex を大域変数にすることで二重起動防止とかに使うこともできる。
2.
理論上は何も問題はない。と言いたいところだけど、ヒープ領域の断片化は発生する可能性がある。
C++ はガベージコレクタ系の言語ではないのでヒープの断片化は結構痛い。
だけど、そういう使い方するんだったら単に自動変数でいいよね。
自動変数にしておけば生成廃棄ともコンパイラが全部面倒見てくれるわけだ。
それなのにわざわざ自分で new/delete をやるのは無駄ムダむだ=禁忌って言っていい。
3.
真にやりたいことがわからん。
delete してよいのは new したものだけ。 new してないものを delete するのはバグ。
クラス型の変数を自動変数として作ったなら、
- 変数定義しているところで自動的にコンストラクタが呼ばれて、
- 寿命が尽きるところ=対応するカギかっこ閉のところで自動的にデストラクタが呼ばれる
けど、これはクラスのメンバについても同様。
(基底クラスのコンストラクタ)→メンバ変数のコンストラクタ→自分自身のコンストラクタ
自分自身のデストラクタ→メンバ変数のデストラクタ→(基底クラスのデストラクタ)
と行ってくれるよ。
自動変数を普通に作る際には new しない。当然 delete してはならない。
void test_func() {
if (...) {
hoge_type h; // new してないのだから delete してはならない
...
}
else {
hoge_type* p = new hoge_type(args); // new したのなら
...
delete p; // delete が必要だけど、先に書いた通りムダ無意味
}
}
自分のクラスが、
- メンバ変数としてポインタ型変数 hoge_type* p; を持っていて
- コンストラクタ内で new している p=new hoge_type();
ならば
- デストラクタ内で delete しなきゃならない delete p;
だけでなくて deep/shallowコピーについても考えないとバグる。
で、そんな面倒なこと考えるくらいならフツーのメンバ変数 hoge_type h; にしとけば何の問題もない。
ってこと。
|