Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制构造函数和重载赋值运算符出现堆损坏错误_C++_Constructor - Fatal编程技术网

C++ 复制构造函数和重载赋值运算符出现堆损坏错误

C++ 复制构造函数和重载赋值运算符出现堆损坏错误,c++,constructor,C++,Constructor,我是一名学生,因此我为没有使用正确的论坛协议提前道歉。关于这个问题,我已经找了好几个小时了,我的同学都帮不了我。我的任务是创建一个复制构造函数,重载赋值运算符(=)和一个析构函数(“大三”),用C++来管理堆上的数组。下面我在VS13中写的内容产生了正确的输出,但我得到了一个调试错误:检测到堆损坏:c++crt检测到应用程序在堆缓冲区结束后写入内存 谁能给我一些指导,我甚至不知道该去哪里找。谢谢 //copy constructor myList::myList(const myList&am

我是一名学生,因此我为没有使用正确的论坛协议提前道歉。关于这个问题,我已经找了好几个小时了,我的同学都帮不了我。我的任务是创建一个复制构造函数,重载赋值运算符(=)和一个析构函数(“大三”),用C++来管理堆上的数组。下面我在VS13中写的内容产生了正确的输出,但我得到了一个调试错误:检测到堆损坏:c++crt检测到应用程序在堆缓冲区结束后写入内存 谁能给我一些指导,我甚至不知道该去哪里找。谢谢

//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已经指出了副本构造函数中的问题

你会得到通知的