gpt4 book ai didi

c++ - 临时变量被重载的 + 和 += 运算符破坏

转载 作者:太空宇宙 更新时间:2023-11-04 15:37:00 26 4
gpt4 key购买 nike

我遇到了段错误,因为我相信我的临时变量在运算符(operator)使用完它之前就被销毁了(释放分配的内存)。这是我主要的代码:

int main(int argc, char *argv[])
{
Bcd b1 = Bcd(100), b2 = Bcd(20), b3 = Bcd(50);
b3 += b1 + b2;
return 0;
}

我在析构函数中放了一条打印语句,输出如下:

sum
destroying 120
sum
segmentation fault

我不明白为什么会这样。看来临时变量b1+b2在sum第二次使用之前就被销毁了。临时变量 b1+b2 不应该在 main 中该行结束之前有效吗?我是否错误地实现了运算符重载函数,或者我的代码是否存在我没​​有考虑到的其他问题?

我的自定义类定义如下:

class Bcd
{
public:
Bcd();
Bcd(const char* num);
Bcd(const Bcd &num);
Bcd(const int num);
~Bcd();
int getLength() const;
Bcd& operator=(const Bcd &rhs);
Bcd& operator+=(const Bcd &rhs);
const Bcd& operator +(const Bcd &rhs) const;
std::string toString() const;
private:
//takes a character and places is at number[index]. If that index does
//not exist, allocates memory for that number and then sets number[index].
void modifyNumber(char num, int index);
char* number;
int length;
int size;
};

.c 文件的重要部分在这里:

Bcd& Bcd::operator +=(const Bcd &rhs){
int minSize, i;
char result[2] = {0};
printf("sum\n");
if(this->getLength() < rhs.getLength())
minSize = this->getLength();
else
minSize = rhs.getLength();

for(i = 0; i < minSize; i++) //SEGFAULT from accessing rhs.number[0]
this->modifyNumber(this->number[i] + rhs.number[i], i);

if(this->getLength() < rhs.getLength()){
for(;i < rhs.getLength(); i++)
this->modifyNumber(rhs.number[i], i);
}
else{
for(;i < this->getLength(); i++)
this->modifyNumber(this->number[i], i);
}
return *this;
}

const Bcd& Bcd::operator +(const Bcd &rhs) const
{
return Bcd(*this) += rhs;
}

Bcd::Bcd(const Bcd &num)
{
length = num.length;
size = num.size;
//allocate memory for number
number = new char[length];
for(int i = 0; i < length; i++)
number[i] = num.number[i];
}

最佳答案

这正是它应该发生的方式。更正确的说法是它不是临时的 b1 + b2 被销毁,它是临时的 Bcd(*this) += rhs 在你的二进制 + 被销毁。

您的 +

实现
const Bcd& Bcd::operator +(const Bcd &rhs) const
{
return Bcd(*this) += rhs;
}

尝试返回绑定(bind)到临时对象的引用。在函数退出之前临时对象被销毁,引用仍然挂起。调用者收到一个“死”引用。行为未定义。

不是临时对象的生命周期通过附加到它的引用来延长的上下文之一。

您不能从二进制 + 返回引用。您根本没有任何东西可以返回引用。相反,按值返回

Bcd Bcd::operator +(const Bcd &rhs) const
{
return Bcd(*this) += rhs;
}

此实现确实会返回一个临时值,用作 b1 + b2。并且那个临时的不会被过早地销毁。

关于c++ - 临时变量被重载的 + 和 += 运算符破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948886/

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