C++ 复制构造函数和重载赋值运算符出现堆损坏错误
我是一名学生,因此我为没有使用正确的论坛协议提前道歉。关于这个问题,我已经找了好几个小时了,我的同学都帮不了我。我的任务是创建一个复制构造函数,重载赋值运算符(=)和一个析构函数(“大三”),用C++来管理堆上的数组。下面我在VS13中写的内容产生了正确的输出,但我得到了一个调试错误:检测到堆损坏:c++crt检测到应用程序在堆缓冲区结束后写入内存 谁能给我一些指导,我甚至不知道该去哪里找。谢谢C++ 复制构造函数和重载赋值运算符出现堆损坏错误,c++,constructor,C++,Constructor,我是一名学生,因此我为没有使用正确的论坛协议提前道歉。关于这个问题,我已经找了好几个小时了,我的同学都帮不了我。我的任务是创建一个复制构造函数,重载赋值运算符(=)和一个析构函数(“大三”),用C++来管理堆上的数组。下面我在VS13中写的内容产生了正确的输出,但我得到了一个调试错误:检测到堆损坏:c++crt检测到应用程序在堆缓冲区结束后写入内存 谁能给我一些指导,我甚至不知道该去哪里找。谢谢 //copy constructor myList::myList(const myList&am
//copy constructor
myList::myList(const myList& source){
cout << "Invoking copy constructor." << endl;
array_capacity = source.array_capacity; //shallow copy
elements = source.elements; //shallow copy
delete[] arrayPointer;
arrayPointer = new double(source.array_capacity); //deep copy
for (int i = 0; i < array_capacity; i++) //copy array contents
{
arrayPointer[i] = source.arrayPointer[i];
}
}
//overloaded assignment operator
myList& myList::operator=(const myList& source){
cout << "Invoking overloaded assignment." << endl;
if (this != &source){
array_capacity = source.array_capacity; //shallow copy
elements = source.elements; //shallow copy
delete[] arrayPointer; //delete original array from heap
arrayPointer = new double(array_capacity); //deep copy
for (int i = 0; i < source.array_capacity; i++) {//copy array contents
arrayPointer[i] = source.arrayPointer[i];
}
}
return *this;
}
//destructor
myList::~myList(){
cout << "Destructor invoked."<< endl;
delete[] arrayPointer; // When done, free memory pointed to by myPointer.
arrayPointer = NULL; // Clear myPointer to prevent using invalid memory reference.
}
//复制构造函数
myList::myList(常量myList和源){
您的代码可能有几个问题。首先,您在arrayPointer
上调用delete
,但它尚未初始化为任何内容。实际上,这可能会删除您已经分配的内存,或者在delete
的实现中导致异常或资产如果您正在分配一个初始化为source.array\u capacity
值的double
,请注意下面一行中使用的括号
arrayPointer = new double(source.array_capacity);
当您最终访问数组边界之外的元素时,这肯定会导致复制过程中出现未定义的行为。上面的一行出现在复制构造函数和复制赋值运算符中,应该使用方括号,如下所示:
arrayPointer = new double[source.array_capacity];
您也从不检查myList
的source
实例中是否存储了任何元素。在这种情况下,您应该很可能将nullptr
(或C++03中的NULL
)分配给arrayPointer
作为补充说明,您实际上不需要在析构函数中将NULL
分配给arrayPointer
。一旦对象被销毁,它就消失了,并且在事实发生后任何试图访问它的行为都会导致未定义的行为。您的代码有几个问题。首先,您在a上调用delete
rrayPointer
但它尚未初始化为任何内容。实际上,这可能会删除您已经分配的内存,或者导致在执行删除
时出现异常或资产。其次,当您初始化它时,您正在将一个双初始化为源.array\u capacity的值y
。请注意下一行中使用的括号
arrayPointer = new double(source.array_capacity);
当您最终访问数组边界之外的元素时,这肯定会导致复制过程中出现未定义的行为。上面的一行出现在复制构造函数和复制赋值运算符中,应该使用方括号,如下所示:
arrayPointer = new double[source.array_capacity];
您也从不检查myList
的source
实例中是否存储了任何元素。在这种情况下,您应该很可能将nullptr
(或C++03中的NULL
)分配给arrayPointer
作为补充说明,您实际上不需要在析构函数中将NULL
分配给arrayPointer
。一旦对象被销毁,它就消失了,并且在事实发生后任何试图访问它的行为都会导致未定义的行为。您的代码有几个问题。首先,您在a上调用delete
rrayPointer
但它尚未初始化为任何内容。实际上,这可能会删除您已经分配的内存,或者导致在执行删除
时出现异常或资产。其次,当您初始化它时,您正在将一个双初始化为源.array\u capacity的值y
。请注意下一行中使用的括号
arrayPointer = new double(source.array_capacity);
当您最终访问数组边界之外的元素时,这肯定会导致复制过程中出现未定义的行为。上面的一行出现在复制构造函数和复制赋值运算符中,应该使用方括号,如下所示:
arrayPointer = new double[source.array_capacity];
您也从不检查myList
的source
实例中是否存储了任何元素。在这种情况下,您应该很可能将nullptr
(或C++03中的NULL
)分配给arrayPointer
作为补充说明,您实际上不需要在析构函数中将NULL
分配给arrayPointer
。一旦对象被销毁,它就消失了,并且在事实发生后任何试图访问它的行为都会导致未定义的行为。您的代码有几个问题。首先,您在a上调用delete
rrayPointer
但它尚未初始化为任何内容。实际上,这可能会删除您已经分配的内存,或者导致在执行删除
时出现异常或资产。其次,当您初始化它时,您正在将一个双初始化为源.array\u capacity的值y
。请注意下一行中使用的括号
arrayPointer = new double(source.array_capacity);
当您最终访问数组边界之外的元素时,这肯定会导致复制过程中出现未定义的行为。上面的一行出现在复制构造函数和复制赋值运算符中,应该使用方括号,如下所示:
arrayPointer = new double[source.array_capacity];
您也从不检查myList
的source
实例中是否存储了任何元素。在这种情况下,您应该很可能将nullptr
(或C++03中的NULL
)分配给arrayPointer
作为补充说明,您实际上不需要在析构函数中将NULL
分配给arrayPointer
。一旦对象被销毁,它就消失了,并且在事后尝试访问它将导致未定义的行为。Captain Obvlious已经指出了副本构造函数中的问题
你会得到通知的