gpt4 book ai didi

c++ - 重载赋值运算符函数和复制构造函数中的错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:31:56 24 4
gpt4 key购买 nike

我目前正在编写一个程序来创建一个动态分配的循环数组。为此,我创建了一个复制构造函数和一个赋值运算符。

当我第二次尝试调用我的赋值运算符时,我收到一个名为“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;
}

最佳答案

Am I writing my copy constructor and assignment operator properly?

我要说的是,在编写赋值运算符时,您正在为自己做更多的工作。

如果你写了一个复制构造函数(你有)和一个析构函数(你没有展示,但我们假设你写了),并且这两个函数都没有错误,那么赋值运算符就可以实现简单地使用 copy / swap .

一般情况下,尽量先写拷贝构造函数和析构函数,再写赋值运算符,这样写赋值运算符的这个“技巧”就可以用上了。这是一个例子:

#include <algorithm>
//...
CircularDynamicArray &operator=(const CircularDynamicArray& source)
{
if (this != &source)
{
CircularDynamicArray temp(source); // Create a copy of what we want
// get the temp's innards, and give temp our stuff
std::swap(temp.m_capacity, m_capacity);
std::swap(temp.m_size, m_size);
std::swap(temp.m_front, m_front);
std::swap(temp.m_rear, m_rear);
std::swap(temp.arr, arr);
} // goodbye temp

return *this;
}

没有分配内存,没有 delete[] 调用,您甚至不需要检查自分配(但为了效率目的无论如何都要检查)。以上也是异常安全的。赋值运算符工作所需的一切,基本上完美无缺。

请注意,您需要交换所有 成员变量——不要忘记任何一个,因为这会导致它无法正常工作。

所要做的就是制作传入对象的拷贝,并用拷贝交换当前对象 this 的内容。然后拷贝会随着您的旧信息消失。这就是为什么您需要一个有效的复制构造函数(以便 source 的初始复制工作)和一个有效的析构函数(以便 temp 的破坏工作)。

关于c++ - 重载赋值运算符函数和复制构造函数中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58350017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com