由于删除数组而导致核心转储
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++ 不断出现“中止(核心转储)”