【发布时间】: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[]有什么用?无论如何,指针都未初始化,但从逻辑上讲,你为什么认为你需要删除那里的任何东西?