gpt4 book ai didi

c++ - 巨大的整数错误。调试断言失败

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:45 24 4
gpt4 key购买 nike

我正在创建一个 HugeInt 类。我的主要:

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
HugeInt hi1("123");
HugeInt hi2("456");

std::cout << hi1 + hi2 << std::endl;

return 0;
}

和我的 HugeInt 类:

#include <iostream>
#include <string>

#define SIZE 32

class HugeInt
{
friend std::ostream & operator<<(std::ostream &, const HugeInt &);

public:
HugeInt();
HugeInt(const char *);
~HugeInt();

HugeInt operator+(const HugeInt &) const;
private:
int * buffer;
int size;
};

和他的方法:

HugeInt::HugeInt()
{
size = SIZE;
buffer = new int[size];

for (int i = 0; i < size; i++) {
buffer[i] = 0;
}
}

HugeInt::HugeInt(const char * hugeNumber)
{
size = strlen(hugeNumber);
buffer = new int[size];

for (int i = size - 1; i >= 0; i--) {
buffer[i] = hugeNumber[i] - '0';
}
}

HugeInt::~HugeInt()
{
delete[] buffer;
}

HugeInt HugeInt::operator+(const HugeInt & operand) const
{
HugeInt temp;

int carry = 0;

if (size >= operand.size)
temp.size = size;
else
temp.size = operand.size;

for (int i = 0; i < temp.size; i++) {
temp.buffer[i] = buffer[i] + operand.buffer[i] + carry;

if (temp.buffer[i] > 9) {
temp.buffer[i] %= 10;
carry = 1;
}
else {
carry = 0;
}
}

return temp;
}

std::ostream & operator<<(std::ostream & output, const HugeInt & complex)
{
for (int i = 0; i < complex.size; i++)
output << complex.buffer[i];
return output;
};

一切编译正常。但控制台显示“-17891602-17891602-17891602”,然后出现错误“调试断言失败!....表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”。

当我们重新定义 operator+() 时,问题出在“return temp”。有什么问题吗?

最佳答案

这段代码中有相当多的错误

您的主要问题是您按值返回一个类(在 operator+ 的末尾)没有为其定义复制构造函数。您应该阅读3 法则(或其较新的咒语5 法则,甚至是0 法则)。

基本上,因为您不进行深拷贝(默认的拷贝构造函数是为您提供的,因为您没有定义一个进行浅拷贝),您的原始 temp和你实际返回的拷贝都指向相同的 buffer .当 temp 的析构函数时在函数结束时运行(假设没有发生 NRVO)它会删除所述缓冲区,即使您返回的拷贝仍然指向它。

您可以通过添加正确的复制构造函数(从而满足规则 3)来解决此问题,或者更好的解决方法是使用 std::vector<int>而不是手动管理的缓冲区,因此不需要复制构造函数或析构函数(零规则)。

只要查看您的代码,就会发现更多问题。在您的添加功能中,您摆弄了 size temp的成员实例而不实际更改缓冲区。如果你碰巧设置了size大于分配的缓冲区,那么您将注销触发未定义行为的有效内存的末尾。

Rule of 3/5/0 的有用链接

关于c++ - 巨大的整数错误。调试断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30755656/

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