Почему необходимо выполнить перестройку после добавления новой переменной-члена в класс? - PullRequest
2 голосов
/ 21 июля 2011

Этим утром в Visual Studio 2005 я попытался добавить новую переменную-член private в класс и обнаружил, что она дает мне всевозможные странные ошибки сегментации и тому подобное.Когда я вошел в режим отладки, я обнаружил, что мой отладчик даже не видел новую переменную-член, и поэтому он давал мне какое-то странное поведение.

Для получения моегопрограмма снова работает (и чтобы отладчик увидел новые переменные-члены, которые я сделал). Зачем было все перестраивать?Почему просто делать обычную сборку недостаточно?

Я уже решил проблему, но чувствую, что понимание процесса сборки поможет мне в будущем.Дайте мне знать, если вам нужна дополнительная информация.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

Когда вы добавляете или удаляете членов класса, вы изменяете структуру памяти объекта.Если вы не перекомпилируете, вы нарушаете правило ODR, и ошибки сегментации являются только следствием этого.

Что касается того, почему это происходит, старый код может получить память для старого размера, а затем передатьэтот объект (без нового члена) к новому коду, который получит доступ после конца выделенной памяти для доступа к новой переменной.Обратите внимание, что спецификатор доступа не влияет вообще, если он является закрытым, то, вероятно, это будут функции-члены класса, которые обращаются к полям.

Если вы добавили поле не в конец, а вПосередине объекта тот же эффект будет виден при доступе к тем полям, которые размечены компилятором в старших адресах памяти.

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

2 голосов
/ 21 июля 2011

Один очевидный ответ будет: «потому что Visual Studios не работает и не обрабатывает зависимости правильно». На самом деле, однако, я не думаю, что вы дали нам достаточно информации, чтобы я мог сделать это заявление (и Visual Studios действительно делает простые случаи правильными).

Когда вы добавляете элементы (private или public, это не имеет значения), особенно элементы данных, но также и виртуальные функции, вы изменяете физическую структуру класса в памяти. Весь код, который зависит от этого физического макета, должен быть перекомпилирован. Обычно система сборки позаботится об этом автоматически, но сломанный make-файл или ошибка в системе могут легко означать, что это не так. (Правильный ответ - не вызывать пересборку / make clean, а исправить проблему с системой сборки.)

...