c++ - 动态数组和运算符重载导致内存崩溃

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

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

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

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

最佳答案

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

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

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

关于c++ - 动态数组和运算符重载导致内存崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15701938/

相关文章:

android - Android NDK(libgcc_real.a)上 '__aeabi_ul2f'的多个定义

ajax - 使用 Ajax 的动态 Flot 图表

c++ - 我的程序在使用 boost 库时不支持线程安全日志记录

c++ - 检查两个索引之间的回文

c++ - 使 Boost.Spirit 解析器跳过所有空格

javascript - 从数组中删除一个元素,然后在不使用全局变量的情况下保留其状态以备将来使用

json - 我想将 JSONObject 添加到 JSONArray 并且该 JSONArray 包含在其他 JSONObject 中

c# - C# 中对象的不同实例的数组的优雅平均

arrays - PostgreSQL - 动态表,在函数中插入文本数组中的值

ios - 根据按钮数量设置 CollectionView 单元格高度