- 【初心者歓迎】C/C++室 Ver.104【環境依存OK】
434 :デフォルトの名無しさん[sage]:2019/02/11(月) 14:12:14.41 ID:0TxoCFW6 - >>431
大体、その3つの通りで、そこに述べられたものの上から優先的に選ぶ。 つまり、普通にメンバ変数にオブジェクトとして宣言するのがC++では 最も効率が良くて伝統的な書き方。それでは問題が生じる場合にオブジェクトの ポインタとして持たせる。スマートポインタは後になって導入されたもので、 人気があるものではないので無視して良い。 二番目のポインタとして持たせるのは、例えば、今定義している最中の クラス(自分自身)と同じ型のデータで、子どもや親にあたるデータへ リンクを作りたいようなときか、または、ある基本クラスを継承した 色々なクラスのオブジェクトを持ちたい場合に用いる。
|
- 【初心者歓迎】C/C++室 Ver.104【環境依存OK】
441 :デフォルトの名無しさん[sage]:2019/02/11(月) 14:49:43.57 ID:0TxoCFW6 - >>438
C++ は、デストラクタに必ずメモリ解放処理を書いておけば、そんなに メモリーリークを気にすることはない。多くの場合にはそれで完全に処理できるから。 次のように書くだけで、ほとんどの場合、メモリーリークは起きない: class CMyClass { BYTE *m_pBuf; CMyClass() { // コンストラクタ m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく } ~CMyClass() { // デストラクタ if ( m_pBuf != NULL ) { delete [] m_pBuf; // メモリの解放 } } }
|
- 【初心者歓迎】C/C++室 Ver.104【環境依存OK】
445 :デフォルトの名無しさん[sage]:2019/02/11(月) 14:56:36.09 ID:0TxoCFW6 - >>441
正しくは、次のようにアクセス制御のための「public :」を書かないといけない。 class CMyClass { protected : BYTE *m_pBuf; // 高速化のため、自動的には初期化はされないのでコンストラクタで初期化する。 public : CMyClass() { // コンストラクタ m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく } ~CMyClass() { // デストラクタ if ( m_pBuf != NULL ) { delete [] m_pBuf; // メモリの解放 } } } なお、必要に応じて、コンストラクタの中で、m_pBuf = new BYTE [xxx]; のように書いても良い。 それと、BYTE は、「オブジェクト」ではないので、あなたの書いているような場合には、 BYTE *m_pBuf の部分を CSomeObject m_pObj; のように変えて、m_pObj = new CSomeObject; のようにする。
|