使用delete []运算符在类中取消分配数据成员的内存

Mut*_*thm 1 c++ memory-management delete-operator

Array班上有以下数据成员.

private: Point* m_data; int m_array_size; 我想为这个类实现一个拷贝构造函数,如下所示:

Array(const Array &a)

在实施内部.我有以下内容.

Array::Array(const Array &a) : m_array_size(a.m_array_size) {
    delete[] m_data;
    m_data = new Point[m_array_size]

    for(int i = 0; i < m_array_size; i++) {
        m_data[i] = a.m_data[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个分段错误错误,我怀疑是由于delete[]操作.但是,我不知道我在这里做错了什么.我只是释放与之关联的内存m_data并重新分配新内存.

我不确定以下内容是否相关,但由于我在Array类中使用自定义对象作为数据成员,因此这是来自该类的重载赋值运算符.

Point& Point::operator = (const Point &source) {

    if(this == &source) return *this;

    m_x = source.m_x;
    m_y = source.m_y;

    return *this;
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 9

您的复制构造函数delete[]m_data没有初始化它的情况下尝试成员.将未初始化的指针传递给delete或是未定义的行为delete[].未初始化指针值的大多数其他用途也是UB.

由于这是构造函数,因此完全没有必要delete[].只需删除该行即可.

另一方面,在复制赋值运算符中,您必须记住delete[]现有数组.