[英]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指针,则将它们称为a
和b
,然后在构造函数中用new
初始化a
,然后再说b = a
(或将a
分配给其他地址) ...我想最好将其设为常数),然后删除a
或b
,这会造成混乱。
如果我没有这样的任务,这安全吗?
谢谢史蒂文
它警告说,如果副本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.