更改数组中的对象但不更改对象的数量 - c ++

时间:2011-11-01 05:22:58

标签: c++ segmentation-fault

我在程序中的某处遇到了分段错误,我认为它可能在这段代码中。 ingredients是指向Ingredient个对象数组的指针。现在,重载*运算符只是更改数组中的每个成分对象。因此,在我看来,我只是更改指针指向的对象,但我没有改变数组的大小,即我没有尝试向Ingredient数组添加更多对象。出于某种原因,我是否还需要释放内存?

Recipe Recipe::operator*(const Fraction multiplier)
{
    for (int count = 0; count < numIngredients; count++)
    {
        ingredients[count] * multiplier;
    }
    servings = multiplier;
    return *this;
}

3 个答案:

答案 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的值。这可能是错的。