Инициализация члена: ошибка в GCC или мое мышление? - PullRequest
4 голосов
/ 22 октября 2010

У меня есть тип enum, определенный в приватной секции моего класса.У меня также есть член этого типа.Когда я пытаюсь инициализировать этот элемент в теле конструктора, у меня возникают проблемы с повреждением памяти во время выполнения.Когда я инициализирую его через список инициализации в конструкторе , тот же , у меня не возникает проблем с повреждением памяти.Я делаю что-то не так?

Я упросту код, и если это ошибка GCC, я уверен, что это комбинация определенных классов, которые я комбинирую / наследую / и т.д., но яОбещаю, что это отражает суть проблемы.Ничто не использует эту переменную-член до ее инициализации, и ничто не использует вновь созданный объект, пока он не будет полностью создан.Инициализация этого члена - действительно первое, что я делаю в теле, и когда происходит повреждение памяти, valgrind говорит, что это на той линии, где я инициализирую переменную.Valgrind говорит, что это недопустимая запись размером 4.

Соответствующий код заголовка:


private:  
  enum StateOption{original = 0, blindside};    
  StateOption currentState;

соответствующий код .cpp (вызывает повреждение памяти и сбой):


MyClass::MyClass(AClass* classPtr) : 
  BaseClass(std::string("some_setting"),classPtr)
{
  currentState = original;
  ...
}

соответствующий код .cpp (не приводит к повреждению памяти и сбоям):


MyClass::MyClass(AClass* classPtr) : 
  BaseClass(std::string("some_setting"),classPtr),
  currentState(original)
{
  ...
}
  

edit: см. Мой «ответ» о причинах этого.После прочтения, кто-нибудь может объяснить мне, почему это имело значение?Я ничего не изменил в заголовке, и, очевидно, объектный файл перестраивался из-за того, что мои операторы печати появлялись, когда я их вставлял, и из-за отсутствия видимой ошибки при одной сборке, но не при другой?Для хорошего объяснения я отмечу это как ответ на этот вопрос.

1 Ответ

1 голос
/ 22 октября 2010

Для потомков:

Похоже, что скрипт make по какой-то причине не принимает изменения в этих файлах.Удаление объектов вручную вместо того, чтобы позволить нашей «чистой» цели в make-файле, привело к полной перестройке (что заняло некоторое время), и проблема исчезла.

...