我在程序中的某处遇到了分段错误,我认为它可能在这段代码中。 ingredients
是指向Ingredient
个对象数组的指针。现在,重载*运算符只是更改数组中的每个成分对象。因此,在我看来,我只是更改指针指向的对象,但我没有改变数组的大小,即我没有尝试向Ingredient
数组添加更多对象。出于某种原因,我是否还需要释放内存?
Recipe Recipe::operator*(const Fraction multiplier)
{
for (int count = 0; count < numIngredients; count++)
{
ingredients[count] * multiplier;
}
servings = multiplier;
return *this;
}
答案 0 :(得分:1)
首先,一些评论。
Recipe::operator*
不应该const
,并且会自行修改。
这就像在做:
a = 5
b = a * 2
在此结尾处a = 10
。
这在概念上是错误的。
您已完成的内容定义为Recipe::operator*=
您应该定义Recipe::operator*=
和Recipe::operator*
,如下所示:
Recipe& Recipe::operator*=(const Fraction multiplier)
{
for (int count = 0; count < numIngredients; count++)
{
ingredients[count] * multiplier;
}
servings = multiplier;
return *this;
}
Recipe Recipe::operator*(const Fraction multiplier)
{
Recipe x = *this;
x *= multiplier;
return x;
}
关于段错误,我们需要查看所有代码以查看其中发生的情况。它可以在您的程序中的任何位置,但要查看的内容将是您的复制构造函数。
答案 1 :(得分:0)
我在该代码中看不到任何会导致崩溃的内容,但是其他地方的问题可能会导致崩溃。例如,如果numIngredients成员不正确,或者成分指针为null。奇怪的是,运营商*被用于配料。通常,二元运算符*将返回一个值而不修改参数,但返回值未被使用。可以定义Ingredient :: operator *以某种方式修改成分,这只是不寻常的。您可能需要提供更多代码才能使问题变得清晰。
答案 2 :(得分:0)
检查numIngredients
的值。这可能是错的。