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

时间:2018-08-17 20:04:15

标签: 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];
    }
}

我收到一个分段错误错误,我怀疑是由于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;
}

1 个答案:

答案 0 :(得分:9)

您的副本构造函数尝试delete[]成员m_data,而没有对其进行初始化。将未初始化的指针传递到deletedelete[]是不确定的行为。未初始化指针值的其他大多数用途也是UB。

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

另一方面,在复制分配运算符中,您必须记住delete[]现有阵列。