0

为了说明我的问题,我最小化了我的来源:

#include <iostream>
class vec{
    public:
    float* X;
    int DIM;
    vec(int dimension)
    {
        DIM = dimension;
        X = new float[dimension];
        for (int i=0;i<DIM;i++)
            X[i] = (float) rand()/RAND_MAX;
    }
    ~vec(void){
        delete [] X;
    }

    vec operator-( vec const& rhs )
    {
        vec ans(DIM);
        for (int i=0;i<DIM;i++)
            ans.X[i] = X[i] - rhs.X[i];
        return ans;
    }
};

int main(){
    vec A(5),B(5),C(5);
    C= A-B;
    return 0;
}

当我执行这个程序时,我得到一个堆被破坏的错误。我很确定析构函数是我的问题。带有C= A-B;变量的行ans会被构造函数销毁,无法返回。是对的吗?如果我删除该行delete [] X;一切正常。但它不会释放内存。

我做了功课,并针对这个问题咨询了最著名的搜索引擎之一,但没有找到任何答案。我该如何解决?

4

1 回答 1

4

C = A-B调用默认的复制分配运算符(因为您还没有定义一个)。因此,两个不同的对象将指向同一个动态分配的数组。

You need to read up on the Rule of Three (in a nutshell: if you define any of the destructor, the copy constructor or the copy-assignment operator, you probably need to define them all).

But preferably, you should avoid using raw arrays entirely; use a container type that manages its own memory.

于 2013-03-29T11:03:08.730 回答