c++ - 可以将成员变量(CBrush *)分配给在具有新原因问题的类构造函数中动态分配的内存吗?

标签 c++ pointers mfc dynamic-memory-allocation

这是我的类(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 指针,让我们称它们为 ab,然后我初始化 a 在我的构造函数中使用 new ,然后我说 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.
};

参见 What is The Rule of Three? .

关于c++ - 可以将成员变量(CBrush *)分配给在具有新原因问题的类构造函数中动态分配的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10439847/

相关文章:

c - C 中指针作为参数

visual-studio - 在mfc中如何将控件置于前面

c++ - 如何自己编写幂函数?

c++ - 保存指向由 void 指针指向的内存的指针

C++ 工厂和类型转换问题

c++指针问题 - 通过方法更新指针

mfc - 在 MFC 中动态创建控件(集合问题)

c++ - 如何将 CPoint 对象转换为字符串?

c++ - Qt : element visible and not obscured (no need to scroll)

c++ - C++ 中的非递归归并排序