由于删除数组而导致核心转储

Posted

技术标签:

【中文标题】由于删除数组而导致核心转储【英文标题】:Core Dumped due to delting an array 【发布时间】:2021-08-27 10:07:12 【问题描述】:

我正在尝试使用低级数组创建一个复制构造函数,并且在使用 delete 时遇到核心转储错误,由于我无法使用 std::vector 来制作,所以找不到解决方案这。 你们能帮帮我吗?? =)

#include<iostream>
#include<string>
#include<initializer_list>
class Vector
    size_t n;
    double* datos;
public:
    Vector(size_t n_,double);
    Vector(const std::initializer_list<double>&l);
    void show();
    ~Vector()
        delete[] datos;
    
    Vector(Vector&& other):n(other.n)
        delete [] datos;
        datos =other.datos;
        other.datos =nullptr;
    
    Vector(const Vector& v);
    Vector operator = (const Vector& v);
;
/* --------------------------- METODOS DE LA CLASE -------------------------- */
Vector::Vector(const Vector&v)
    delete[]datos; //CORE DUMPED
    n=v.n;
    datos = new double[n];
    
    for (size_t i = 0; i < n; i++)
    
        datos[i] = v.datos[i];
    
    std::cout<<std::endl;
    

Vector Vector::operator = (const Vector& v)
    delete [] datos;//CORE DUMPED
    n = v.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=0):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();

使用 POP OS 21.04(以防万一这有帮助)。

请不要对我粗鲁,我是一名初级程序员,想通过九月份的考试 =(

【问题讨论】:

delete[]datos; //CORE DUMPED -- 问问自己 -- 你为什么在复制构造函数中调用delete[]?你知道复制constructor的目的是什么吗?如果是构造一个新的对象,delete[]有什么用?无论如何,指针都未初始化,但从逻辑上讲,你为什么认为你需要删除那里的任何东西? 【参考方案1】:
Vector::Vector(const Vector&v)
    delete[]datos; //CORE DUMPED

你没有初始化datos,所以它的值是不确定的。当你删除一个不确定的指针时,程序的行为是不确定的。 “CORE DUMPED”是您可能观察到的一种可能行为。

【讨论】:

这解决了我的问题,没有意识到 datos 在那一行是空的,thx =)【参考方案2】:

您正在构造函数中对delete [] datos 发出不需要的调用(移动和复制)。

由于datos 未初始化,因此在未初始化的指针上调用delete [] 会导致未定义的行为——在您的情况下,您的程序会崩溃。

由于对象正在构造,因此没有理由在指针上发出delete [],因为对象this 是全新的。

只需从构造函数中删除对delete [] datos; 的调用即可。这是否是唯一的问题是另一回事,但这是一个存在的问题。


另外,你的赋值运算符:

Vector Vector::operator = (const Vector& v)

也不正确。在delete [] 调用后分配新内存失败,因此写入的for 循环将写入未分配的内存。此外,它应该返回对当前 Vector 对象的引用,而不是全新的 Vector 对象。

实现赋值运算符最简单的方法是使用std::swap

#include <algorithm>
//...
Vector& Vector::operator = (Vector v)

    std::swap(v.datos, datos);
    std::swap(v.n, n);
    return *this;

这假设您有一个工作的、无错误的复制构造函数和析构函数 Vector。请参阅copy / swap idiom 了解有关其工作原理的详细信息。

【讨论】:

以上是关于由于删除数组而导致核心转储的主要内容,如果未能解决你的问题,请参考以下文章

杀死进程而不创建核心转储?

删除类中的动态二维数组时,C++ 不断出现“中止(核心转储)”

C语言 文件方面 段错误 核心已转储 以及字符串查找删除的问题

QThread 转储核心

RPC:分段错误(核心转储)

c中的分段错误(核心转储)