繁体   English   中英

是否可以将成员变量(CBrush *)分配给具有新原因的类构造函数中动态分配的内存?

[英]Can assigning a member variable (CBrush *) to memory dynamically allocated in a class constructor with new cause problems?

这是我的课程设置的精简版:

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;
}

现在,当我运行一个分析代码中细微错误的工具时,我得到了:

没有赋值运算符的'Name'类的构造函数中的new-在引用类的构造函数中,出现了一个新的。 但是,没有为该类声明任何赋值运算符。 大概某些类成员(或多个成员)指向动态分配的内存。 默认分配运算符未正确处理此类内存。 通常,需要一个自定义的赋值运算符。 因此,如果x和y均为Symbol x = y类型; 将导致指针重复。 以后的删除会造成混乱。

我相信这是在告诉我,如果我有两个成员变量是CBrush指针,则将它们称为ab ,然后在构造函数中用new初始化a ,然后再说b = a (或将a分配给其他地址) ...我想最好将其设为常数),然后删除ab ,这会造成混乱。

如果我没有这样的任务,这安全吗?

谢谢史蒂文

它警告说,如果副本CMyClass由随后的两个实例CMyClass都指向同一个CBrush 如果一个CMyClass实例被破坏,则另一个实例将悬空指向CBrush指针,因为被破坏的CMyClass删除了它。

如果您有一个动态分配的成员,则需要实现一个复制构造函数和赋值运算符,以正确地复制动态分配的成员,或者通过声明复制构造函数和赋值运算符为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.
};

请参阅什么是三规则?

不需要在析构函数中检查_pRadBkgColor != NULL 可以使用NULL指针调用delete 以下内容就足够了:

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

您的代码没有错。 如果为对象分配了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()
{

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM