Visual Studio 2010, может ли просто включение нового класса вызвать ошибку сборки релиза? - PullRequest
0 голосов
/ 23 марта 2012

Хорошо, мне нужна проверка работоспособности.

Я работал над своим проектом, начав вчера добавлять новый класс, и решил скомпилировать свой прогресс до сих пор.После выполнения релизной сборки приложения я сразу заметил ошибку.(В данном случае это поле астероидов, которое не отображается в моей игре). Это сразу смутило меня, так как я не коснулся кода, который мог бы создать эту ошибку.И все остальное выглядит нормально, как обычно.

Перенесемся через день, и я думаю, что я сузил причину, однако это не имеет никакого смысла для меня вообще.

Этопроисходит только с выпуском сборок.(Примерно 1 из 5 казней) Но я могу предотвратить это, просто не включив мой новый класс в проект.Несмотря на то, что класс еще не используется или еще не включен в проект.Я даже пошел дальше и обнаружил, что просто комментируя определения классов и оставляя заголовок - это хорошо, но когда я раскомментирую их, он возвращается.И для дальнейшего тестирования я включил его в более старую сборку с теми же результатами.

Не повлияет ли неиспользуемый код на компиляцию сборки выпуска?Похоже ли это на ошибку Visual Studio?Или это не имеет никакого смысла вообще?(Другими словами, я только что нашел действительно убедительную красную сельдь?) Что я могу сделать, чтобы помочь выяснить источник этой ошибки?

1 Ответ

2 голосов
/ 23 марта 2012

Повлияет ли неиспользуемый код на компиляцию сборки выпуска?

Да.Как этот ответ SO объясняет, Visual C ++ сохраняет неиспользуемые функции, которые не помечены как встроенные.

Похоже ли это на ошибку Visual Studio?

Это маловероятно, как я объясню в ответе на ваш следующий вопрос.Эрик Липперт объясняет , что, поскольку компилятор используется так часто, что легко обнаруживаемые и обнаруживаемые ошибки уже найдены и исправлены, на 1015 * гораздо более вероятно, что ошибка присутствует в вашем кодечем эта ошибка в компиляторе C ++.

Я только что нашел действительно убедительную красную сельдь?

Да, я думаю, что вы сделали.Не видя кода для рисования поля астероидов, я не могу быть уверен, но, вероятно, вы где-то там разыменовываете плохой указатель.Теперь он начинает понимать, на какие данные указывает указатель.

Когда неиспользуемый класс включается в скомпилированную сборку, объем памяти, выделяемой вашему коду, увеличивается, что означает, что ваша куча должна начинаться выше в памяти,и куча вещей переместится на более высокие адреса.Это означает, что неверный указатель может указывать на разные данные в зависимости от того, скомпилирован ли неиспользуемый класс в исполняемый файл или нет.Когда вы разыменовываете этот указатель, вы получаете разные результаты.Вот почему удаление кода «исправляет» ошибку - всякий раз, когда вы убираете неиспользуемый класс, плохой указатель указывает на нужные вам данные, а не на другие данные.Как справедливо отмечает @awoodland в комментариях, вы действительно неудачливы без неиспользуемого класса и вам повезло с ним, потому что вы не можете найти ошибку, которая может проявиться во всевозможных странных способах, как только вы начнетераспространение кода среди ваших друзей (или клиентов, если это коммерческий продукт).Такие ошибки типа «плохой указатель, который случается, работают» могут легко привести к тому, что ваш код будет работать корректно на некоторых машинах и резко потерпеть неудачу на других машинах, что очень трудно отладить.Лучше, если вы нашли ошибку сейчас, чем позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...