【问题标题】:dynamic arrays and operator overloading cause memory crash动态数组和运算符重载导致内存崩溃
【发布时间】:2013-03-29 11:01:14
【问题描述】:

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

#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; 行,一切正常。但它不会释放内存。

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

【问题讨论】:

  • ans 被破坏不是问题。制作了ans 的临时副本,这就是返回的内容(原则上)。

标签: c++ arrays dynamic memory-leaks operator-overloading


【解决方案1】:

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

您需要阅读Rule of Three(简而言之:如果您定义了任何析构函数、复制构造函数或复制赋值运算符,您可能需要全部定义)。

但最好避免完全使用原始数组;使用管理自己内存的容器类型。

【讨论】:

  • "使用管理自己内存的容器类型" 这就是应该做的。基本是std::vector,虽然在OP的情况下,我也会考虑std::valarray
  • 解决方案:void operator=(vec const& rhs) { for (int i=0;i
  • 谢谢,这是我没有看到的重点。抱歉这个愚蠢的问题。
猜你喜欢
  • 2015-02-15
  • 1970-01-01
  • 2013-09-28
  • 2014-06-30
  • 2014-11-22
  • 2016-02-21
  • 1970-01-01
  • 2015-04-24
  • 2015-06-25
相关资源
最近更新 更多