You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现自定义Vector类删除数组触发Core Dumped错误求助

问题原因排查

你的代码出现Core Dumped是多个内存操作逻辑错误共同导致的,具体问题如下:

  • 拷贝构造函数逻辑错误:拷贝构造的作用是初始化全新的对象,此时当前对象的datos指针还未初始化,属于野指针,直接执行delete[] datos是对野指针做释放操作,直接触发段错误,拷贝构造完全不需要释放操作。
  • 移动构造函数逻辑错误:移动构造同样是新对象的构造函数,当前对象的datos为未初始化的野指针,开头的delete[] datos同样属于野指针释放,会触发崩溃。
  • 拷贝赋值运算符逻辑错误:
    1. 释放原有datos内存后,没有为datos重新分配和传入对象大小匹配的新内存,直接对已释放的内存地址赋值属于野指针访问,会触发崩溃
    2. 返回值设计错误,拷贝赋值运算符规范应当返回Vector&引用类型,你写的返回值类型会触发不必要的临时对象拷贝,进一步引发double free问题
    3. 没有处理自赋值场景,如果出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:12:01