C++实现自定义Vector类删除数组触发Core Dumped错误求助
问题原因排查
你的代码出现Core Dumped是多个内存操作逻辑错误共同导致的,具体问题如下:
- 拷贝构造函数逻辑错误:拷贝构造的作用是初始化全新的对象,此时当前对象的
datos指针还未初始化,属于野指针,直接执行delete[] datos是对野指针做释放操作,直接触发段错误,拷贝构造完全不需要释放操作。 - 移动构造函数逻辑错误:移动构造同样是新对象的构造函数,当前对象的
datos为未初始化的野指针,开头的delete[] datos同样属于野指针释放,会触发崩溃。 - 拷贝赋值运算符逻辑错误:
- 释放原有
datos内存后,没有为datos重新分配和传入对象大小匹配的新内存,直接对已释放的内存地址赋值属于野指针访问,会触发崩溃 - 返回值设计错误,拷贝赋值运算符规范应当返回
Vector&引用类型,你写的返回值类型会触发不必要的临时对象拷贝,进一步引发double free问题 - 没有处理自赋值场景,如果出现
a=a的调用,先释放自身内存后访问传入对象的datos就是访问已释放内存,会触发崩溃
- 释放原有
- 构造函数默认参数位置错误:默认参数需要写在类内的函数声明处,类外定义不能重复写默认参数,否则会触发编译错误。
修正后可运行代码
#include<iostream> #include<string> #include<initializer_list> class Vector{ size_t n; double* datos; public: // 默认参数移到声明处 Vector(size_t n_,double d = 0); Vector(const std::initializer_list<double>&l); void show(); ~Vector(){ delete[] datos; } // 修正移动构造,去掉不必要的delete,加noexcept符合规范 Vector(Vector&& other) noexcept :n(other.n), datos(other.datos){ other.datos = nullptr; other.n = 0; } Vector(const Vector& v); // 赋值运算符返回值改为引用 Vector& operator = (const Vector& v); }; /* --------------------------- METODOS DE LA CLASE -------------------------- */ Vector::Vector(const Vector&v){ // 去掉错误的delete操作 n=v.n; datos = new double[n]; for (size_t i = 0; i < n; i++) { datos[i] = v.datos[i]; } } // 返回值改为引用 Vector& Vector::operator = (const Vector& v){ // 先处理自赋值场景 if(this == &v) return *this; delete [] datos; n = v.n; // 新增内存分配逻辑 datos = new double[n]; for (size_t i = 0; i < n; i++) { datos[i] = v.datos[i]; } return *this; } Vector::Vector(const std::initializer_list<double>&l):n(l.size()),datos(new double[n]){ size_t j= 0; for (auto i:l) { datos[j]=i; ++j; } } void Vector::show(){ for (size_t i = 0; i < n; i++) { std::cout<<datos[i]<<", "; } std::cout<<std::endl; } // 去掉重复的默认参数定义 Vector::Vector(size_t n_,double d):n(n_),datos(new double[n]){ if (n < 1) { throw std::invalid_argument("Wrong size!"); } for (size_t i = 0; i < n; i++) { datos[i] = d; } } int main(){ Vector b={2,3,4,5,6},a(3); a=b; a.show(); }
运行后输出结果为:2, 3, 4, 5, 6, ,符合预期。
内容的提问来源于stack exchange,提问作者Antonio Roldan
相关产品推荐
相关产品推荐

