复制构造函数不起作用并导致内存泄漏

Copy constructor does not work and causes memory leak

本文关键字:内存 泄漏 构造函数 不起作用 复制      更新时间:2023-10-16

对于我自己创建的Vector类:

class Vector
{
private:
    double* elem;
    int n;
public:
    Vector();
    Vector(const int s);
    Vector(Vector&);
    ~Vector();
    void print();
    void set(const int, const double);
    double get(const int) const;
    int size() const;
    double norm() const;
    Vector add(const Vector&) const;
    Vector subtract(const Vector&) const;
    double scalar(const Vector&) const;
};

当我尝试调用复制构造函数时:

Vector::Vector(Vector& x)
{
int count = 0;
n = x.n;
elem = new double[n];
while (count < n)
    {
    elem[n] = x.elem[n];
    count++;
    }
}

它复制地址而不是矢量的元素。有人知道为什么会发生这种事吗?

附言:我在析构函数里写了

delete []elem;

因为

Vector(Vector&);

它不是复制构造函数的签名。正确的签名是

Vector(const Vector&);

编译器看不到用户定义的复制构造函数,而是静默地生成自己的默认复制构造函数,只复制

double* elem;
int n;

并且不关心分配新的内存和复制数组的元素。

Vector::Vector(Vector& x)
{
int count = 0;
n = x.n;
elem = new double[n];
while (count < n)
    {
    elem[n] = x.elem[n];//here should be:elem[count] = x.elem[count]
    count++;
    }
}