gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:17:08 33 4
gpt4 key购买 nike

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

#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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com