ошибка сегментации дампа ядра с C ++ - PullRequest
1 голос
/ 15 ноября 2010

Я новичок в приложении 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; //value is a reference to UNION Value.
}

, когда приложение использует этот фрагмент кода, тогда оно генерирует ошибку сегментации во время выполнения и завершается.Я поместил несколько операторов вывода на консоль и понял, что ошибка сегментации может быть вызвана

   *(value.value_string) = value_string_arg;

строкой.

Может ли кто-нибудь подтвердить мою идентификацию ошибки сегментации?Кроме того, я не совсем уверен, как обойти эту проблему.Пожалуйста, дайте мне знать, если у кого-то есть мысли о том же.

Любая помощь очень ценится.Спасибо

~ Джеган

Ответы [ 4 ]

3 голосов
/ 15 ноября 2010

Вы, вероятно, хотите сделать что-то вроде:

value.value_string = new RWCString(value_string_arg);

В вашем коде, если value.value_string - неинициализированный указатель, то выполняемое вами задание будет пытаться записать какую-то случайную часть памяти, вызывая значение сегментации.В моем коде выше оператор new выделяет новый блок памяти для RWCString и вызывает конструктор копирования для копирования value_string_arg.Затем он назначает указатель для недавно выделенного блока памяти на value.value_string.

Не забывайте delete value.value_string позже, когда вы закончите с этим, чтобы избежать утечки памяти!

2 голосов
/ 15 ноября 2010

Попробуйте проанализировать дамп ядра с помощью gdb. Дамп ядра должен точно указывать, где происходит ошибка сегмента. Вам нужно будет скомпилировать с включенной отладкой.

2 голосов
/ 15 ноября 2010

Когда вы делаете *(value.value_string), вы разыменовываете указатель, т.е. вы просите компилятор установить значение вещи , на которую указывает value.value_string. Вы должны убедиться, что он указывает на действительный кусок памяти. Если вы этого не сделаете, то, когда вы назначите его, вы закончите запись в случайное место в памяти, отсюда ошибка сегментации.

В C ++ вы обычно получаете правильный объем памяти, выполняя что-то вроде value.value_string = new RWCString; заранее (и убедитесь, что вы delete сделали это, когда закончите). Однако это опасно в вашей ситуации, потому что вы создали объединение указателя. Как только вы напишите, например, value.value_float, вы потеряете значение указателя, и у вас будет утечка памяти.

0 голосов
/ 15 ноября 2010

(язык, который вы используете - C ++. Не C / CPP или C / C ++.)

Основная проблема здесь: вы используете union. Начинающим, вероятно, не следует использовать union s, потому что, если вы инициализируете одного участника, а затем пытаетесь использовать другого, вы взрываетесь.

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

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

...