【发布时间】:2019-10-12 01:06:52
【问题描述】:
我目前正在编写一个创建动态分配的循环数组的程序。为此,我创建了一个复制构造函数和一个赋值运算符。
当我第二次尝试调用我的赋值运算符时,我收到一个名为“munmap_chunk(): invalid pointer”的错误。如果我调用它一次,则不会显示错误。我是否正确编写了我的复制构造函数和赋值运算符?如果需要任何信息,我很乐意提供,谢谢。
CircularDynamicArray(const CircularDynamicArray& source){
cout << "copy constructor called" << endl;
m_capacity = source.m_capacity;
m_size = source.m_size;
m_front = source.m_front;
m_rear = source.m_rear;
arr = new elmtype[source.m_capacity];
for(int i = 0; i < source.m_capacity; i++) {
arr[i] = source.arr[i];
}
}
//overloaded assignment operator
CircularDynamicArray &operator = (const CircularDynamicArray& source) {
cout << "Overloaded Assignment called" << endl;
//check for self assignment
if (this == &source) {
return *this;
}
m_capacity = source.m_capacity;
m_size = source.m_size;
m_front = source.m_front;
m_rear = source.m_rear;
delete[]arr;
for(int i = 0; i < source.m_capacity; i++) {
arr[i] = source.arr[i];
}
return *this;
}
【问题讨论】:
-
你是
delete[]ingarr,然后在下面的循环中立即使用arr[i]对其进行索引。这会导致未定义的行为。 -
如果你写了一个析构函数,你的赋值操作符如果你使用“复制/交换”就不需要那么复杂了。事实上,这很简单——只需 5 行
std::swap行——无需分配内存,无需删除内存,一切都会正常进行。
标签: c++