0

これは、私のクラス設定の簡素化されたバージョンです。

class CMyClass : public CDialog
{
    CMyClass(CWnd *pParent = NULL); // constructor
    ~CMyClass();
    _ CBrush *_pRadBkgColor; // background color of a radio button
}

CMyClass::CMyClass(CWnd *pParent /*=NULL*/)
{
    // assign CBrush pointer to a new brush
    _pRadBkgColor = new CBrush(RGB(0xFF, 0xFF, 0xFF));
}

CMyClass::~CMyClass()
{
    if( _pRadBkgColor != NULL )
    {
        delete _pRadBkgColor
    }
    _pRadBkgColor = NULL;
}

ここで、微妙なエラーのコードを解析するツールを実行すると、次のようになります。

代入演算子を持たないクラス「名前」のコンストラクターの新しい -- 引用されたクラスのコンストラクター内で、新しいものが登場しました。ただし、このクラスには代入演算子が宣言されていません。おそらく、一部のクラス メンバー (または複数のメンバー) が、動的に割り当てられたメモリを指している可能性があります。このようなメモリは、デフォルトの代入演算子では適切に処理されません。通常、カスタム代入演算子が必要になります。したがって、x と y が両方とも Symbol x = y; 型の場合。ポインタの重複が発生します。後で削除すると混乱が生じます。

CBrush ポインターである 2 つのメンバー変数がある場合、それらaを呼び出して、コンストラクターでb初期化anew、後で言う(または、実際には他のアドレスb = aに割り当てる...aそれを一定にするのが最善です)、次にaまたはを削除するbと、混乱が生じます。

そのような割り当てを行わない場合、これは安全ですか?

ありがとうスティーブン

4

3 に答える 3

1

CMyClassのコピーが作成された場合、両方の2つのインスタンスがCMyClass同じを指していることを警告していますCBrush。インスタンスの1つが破棄された場合、破棄されたインスタンスがそれを削除しCMyClassたため、もう1つのインスタンスにはaへのダングリングポインタが残ります。CBrushCMyClass

動的に割り当てられたメンバーがある場合は、コピーコンストラクターと代入演算子を実装して、動的に割り当てられたメンバーを正しくコピーするか、コピーコンストラクターと代入演算子を宣言してクラスをコピー不可にする必要がありますprivate

class CMyClass : public CDialog
{
public:
    CMyClass(CWnd *pParent = NULL);
    ~CMyClass();
private:
    CBrush *_pRadBkgColor;
    CMyClass(const CMyClass&);             // Copy constructor.
    CMyClass& operator=(const CMyClass&);  // Assignment operator.
};

三つのルールとは何ですか?を参照してください。。

于 2012-05-03T22:08:29.840 に答える
0

デストラクタのチェック_pRadBkgColor != NULLは不要です。ポインタdeleteで呼び出すことができます。NULL以下で十分です。

CMyClass::~CMyClass() 
{
    delete _pRadBkgColor 
    _pRadBkgColor = NULL; 
} 
于 2012-05-03T22:13:00.137 に答える
0

コードに問題はありません。オブジェクトが new で割り当てられている場合は、delete を呼び出して明示的に解放する必要があります。あなたのコードはまさにそれを行います。

また、 RAIIと呼ばれるイディオムがあり、あなたがしていることが正しい理由をさらに説明しています。

ただし、スタック割り当て変数は多くの場合高速であり、次のコードを使用して問題全体を回避できます。

class CMyClass : public CDialog
{ 
  CMyClass(CWnd *pParent = NULL);
  ~CMyClass();
 _ CBrush _pRadBkgColor;
}

CMyClass::CMyClass(CWnd *pParent /*=NULL*/)
      : _pRadBkgColor(RGB(0xFF, 0xFF, 0xFF))
{
  HBRUSH hBr = _pRadBkgColor; // no problem, conversion operator.
}

CMyClass::~CMyClass()
{

}
于 2012-05-03T22:43:02.380 に答える