C++ 删除复制构造函数和赋值运算符中的专用数组

C++ 删除复制构造函数和赋值运算符中的专用数组,c++,copy-constructor,assignment-operator,delete-operator,C++,Copy Constructor,Assignment Operator,Delete Operator,我试图实现一个为堆分配内存的容器,但似乎我的基构造函数和参数构造函数彼此不喜欢。下面,我发布了代码,没有任何注释。就目前而言,它崩溃了 #include <iostream> using namespace std; class foo { public: foo() {size=1; vals = new double[1]; vals[0]=0;} ~foo() {delete[] vals;} foo(const foo& other)

我试图实现一个为堆分配内存的容器,但似乎我的基构造函数和参数构造函数彼此不喜欢。下面,我发布了代码,没有任何注释。就目前而言,它崩溃了

#include <iostream>
using namespace std;

class foo
{
public:
    foo() {size=1; vals = new double[1]; vals[0]=0;}
    ~foo() {delete[] vals;}

    foo(const foo& other)
    {
        size=other.getsize();
        delete[] vals;
        vals = new double[size];
        for(long unsigned i=0; i<size; i++)
            vals[i]=other[i];
    }

    foo& operator=(const foo& other)
    {
        size=other.getsize();
        delete[] vals;
        vals = new double[size];
        for(long unsigned i=0; i<size; i++)
            vals[i]=other[i];
        return *this;
    }

    foo(double* invals, long unsigned insize)
    {
        size=insize;
        delete[] vals;
        vals = new double[size];
        for(long unsigned i=0; i<size; i++)
            vals[i]=invals[i];
    }

    double operator[](long unsigned i) const {return vals[i];}

    long unsigned getsize() const {return size;}
private:
    double* vals;
    long unsigned size;
};


int main()
{
    double bar[3] = {5,2,8};
    foo B(bar, 3);

    cout<< B[0]<< " "<< B[1]<< " "<< B[2]<<endl;    //couts fine

    foo A;    //crashes here

    return 0;
}
#包括
使用名称空间std;
福班
{
公众:
foo(){size=1;vals=new double[1];vals[0]=0;}
~foo(){delete[]vals;}
foo(const foo&其他)
{
size=other.getsize();
删除[]个VAL;
VAL=新的双精度[尺寸];

对于(长无符号i=0;i我假设您有一些非常令人信服的理由不在这里使用
std::vector

但无论如何……在复制构造函数中,您不希望
删除[]VAL

foo(const foo& other)
{
    size=other.getsize();
    vals = new double[size];
    for(long unsigned i=0; i<size; i++)
        vals[i]=other[i];
}

当您将这些括号放在变量名之后时,实际上您是在使用从C继承的语法编写函数声明,而
a
成为函数指针类型。

如果您想使用
delete
,而此时什么都没有,您必须根据需要重载delete运算符,因为当该构造函数此时调用,该对象中没有任何内容,这可能是崩溃的问题。。
foo(const foo& other)
{
    size=other.getsize();
    vals = new double[size];
    for(long unsigned i=0; i<size; i++)
        vals[i]=other[i];
}
foo A;