这是我的类(class)设置的精简版:
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”的构造函数中没有赋值运算符的新内容——在一个 引用类的构造函数,出现了一个新的。但是,没有赋值运算符 为这个类声明。大概某些类成员(或成员)动态指向 分配的内存。默认赋值运算符未正确处理此类内存。 通常需要自定义赋值运算符。因此,如果 x 和 y 都是类型 象征 x = y; 将导致指针重复。稍后删除会造成困惑。
我相信它告诉我,如果我有两个成员变量是 CBrush 指针,让我们称它们为 a
和 b
,然后我初始化 a
在我的构造函数中使用 new
,然后我说 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.
};
关于c++ - 可以将成员变量(CBrush *)分配给在具有新原因问题的类构造函数中动态分配的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10439847/