我的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;
}
答案 0 :(得分:9)
您的副本构造函数尝试delete[]
成员m_data
,而没有对其进行初始化。将未初始化的指针传递到delete
或delete[]
是不确定的行为。未初始化指针值的其他大多数用途也是UB。
由于这是构造函数,因此delete[]
完全没有必要。只需删除该行即可。
另一方面,在复制分配运算符中,您必须记住delete[]
现有阵列。