#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
. Это может быть неправильно.