Ошибка сегментации дампа ядра с 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, Новички, вероятно, не должны использовать unions, потому что если вы инициализируете одного участника, а затем пытаетесь использовать другого, вы взрываетесь.

Так притворяться, что нет union и у тебя действительно есть RWCString* указатель: вы уверены, что он указывает на действительный объект? Когда был RWCString построено, а каково его время жизни?

Конечно, ошибки сегментации не всегда происходят прямо в неверном коде. У вас может случиться что-то плохое до этого, а потом кусаться.

Другие вопросы по тегам