изменение объектов в массиве, но не количества объектов — c

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

Я борюсь с ошибкой сегментации где-то в моей программе, и я думаю, что это может быть в этом фрагменте кода. ingredients является указателем на массив Ingredient объектов. Теперь перегруженный оператор * просто изменяет каждый из объектов-компонентов в массиве. Итак, мне кажется, что я просто изменяю объекты, на которые указывает указатель, но я не меняю размер массива, т.Е. Я не пытаюсь добавить больше объектов в Ingredient массив. Нужно ли мне по какой-то причине все еще освобождать память?

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

Комментарии:

1. Пожалуйста , не делайте этого. Если вы делаете, чтобы изменить целевой объект, вы должны перегружать что-то вроде operator*= , по крайней мере, дать разумное предупреждение об изменении. Что касается вашего вопроса об освобождении: я не думаю, что вы рассказали нам достаточно, чтобы сделать разумное предположение об этом.

2. Что это ingredients[count] * multiplier; делает?

3. Не ingredients[count] * multiplier; должно приводить к отсутствию операции ?

4. Ошибка сегментации обычно означает неинициализированные указатели. Покажите нам конструктор и как вы добавляете ингредиенты.

5. Освобождение памяти никогда (ни при каких обстоятельствах, о которых я могу думать) не исправит ошибку сегментации; это просто предотвращает утечки памяти.

Ответ №1:

Во-первых, несколько комментариев.

Ваш Recipe::operator* не const тогда, когда он должен быть, и изменяет себя.

Это похоже на выполнение:

 a = 5
b = a * 2
 

И наличие a = 10 в конце этого.

Это концептуально неверно.

То, что вы сделали, определено Recipe::operator*=

Вы должны определить Recipe::operator*= и Recipe::operator* понравиться следующее:

 Recipeamp; 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;
}
 

Что касается ошибки сегментации, нам нужно будет просмотреть весь код, чтобы понять, что там происходит. Это может быть где угодно в вашей программе, но, например, нужно обратить внимание на ваш конструктор копирования.

Ответ №2:

Я не вижу в этом коде ничего, что обязательно привело бы к сбою, но проблема где-то в другом месте может привести к сбою там. Например, если элемент numIngredients был неправильным или указатель ингредиентов был нулевым. Странно, что оператор * используется для ингредиентов. Обычно двоичный оператор * возвращает значение и не изменяет аргументы, но возвращаемое значение не используется. Ингредиент::оператор * может быть определен для изменения ингредиента каким-либо образом, это было бы просто необычно. Вероятно, вам пришлось бы дать больше кода, чтобы проблема стала понятной.

Ответ №3:

Проверьте значение numIngredients . Это может быть неправильно.