Ошибка сегментации дампа ядра с C++
Я новичок в приложении C/CPP и анализирую проблему с фрагментом кода C/CPP. Я столкнулся с ошибкой сегментации, и я не должен определять основную причину ошибки сегментации.
Пожалуйста, найдите сценарий ниже:
union Value
{
int value_int; float value_float; RWCString * value_string;
}
void setValueString (const RWCString & value_string_arg) { *(value.value_string) = value_string_arg; // значение является ссылкой на значение UNION. }
когда приложение использует этот фрагмент кода, оно генерирует ошибку сегментации во время выполнения и завершает работу. Я поместил несколько операторов вывода на консоль и понял, что ошибка сегментации может быть связана с
*(value.value_string) = value_string_arg;
линия.
Может ли кто-нибудь подтвердить мою идентификацию ошибки сегментации? Кроме того, я не совсем уверен, как обойти эту проблему. Пожалуйста, дайте мне знать, если у кого-то есть мысли о том же.
Буду признателен за любую оказанную помощь. Спасибо
~Jegan
4 ответа
Вы, вероятно, хотите сделать что-то вроде:
value.value_string = new RWCString(value_string_arg);
В вашем коде, если value.value_string
является неинициализированным указателем, тогда выполняемое вами задание будет пытаться записать в некоторую случайную часть памяти, вызывая значение сегментации. В моем коде выше new
Оператор выделяет новый блок памяти для RWCString
и вызывает конструктор копирования для копирования value_string_arg
, Затем он назначает указатель на недавно выделенный блок памяти value.value_string
,
Не забудь delete value.value_string
позже, когда вы закончите с этим, чтобы избежать утечки памяти!
Попробуйте проанализировать дамп ядра с помощью gdb. Дамп ядра должен точно указывать, где происходит ошибка сегмента. Вам нужно будет скомпилировать с включенной отладкой.
Когда вы делаете *(value.value_string)
, вы разыменовываете указатель, т.е. вы просите компилятор установить значение вещи, на которую указывает value.value_string
, Вы должны убедиться, что он указывает на действительный кусок памяти. Если вы этого не сделаете, то когда вы назначите его, вы закончите запись в случайное место в памяти, отсюда и ошибка сегментации.
В C++ вы, как правило, получаете правильный кусок памяти, выполняя что-то вроде value.value_string = new RWCString;
заранее (и убедившись, что вы delete
это когда ты закончишь). Однако это опасно в вашей ситуации, потому что вы создали объединение указателя. Как только вы напишите, например, в value.value_float
, вы потеряете значение указателя, и у вас будет утечка памяти.
(Язык, который вы используете, это C++. Не C/CPP или C/C++.)
Основная проблема здесь: вы используете union
, Новички, вероятно, не должны использовать union
s, потому что если вы инициализируете одного участника, а затем пытаетесь использовать другого, вы взрываетесь.
Так притворяться, что нет union
и у тебя действительно есть RWCString*
указатель: вы уверены, что он указывает на действительный объект? Когда был RWCString
построено, а каково его время жизни?
Конечно, ошибки сегментации не всегда происходят прямо в неверном коде. У вас может случиться что-то плохое до этого, а потом кусаться.