Я делаю это вики сообщества, чтобы лучше понять семантические различия между этими ошибками и их временем выполнения или скомпилированными последствиями. Кроме того, я слишком долго программировал на Java и хочу лучше изучать указатели на C ++, поэтому мне нужны другие люди для этого.
Edit2: Я занимаюсь рефакторингом этого вопроса. Различие, которое я пытаюсь провести, состоит в том, что в управляемом коде все эти ошибки единообразно обрабатываются с помощью исключения. Тем не менее, C ++ не так прост - и я хочу понять, есть ли в каждом случае вероятность ошибки, segfault, восстанавливаемого поведения или, что еще хуже, ошибки silent , которая распространяется , Пожалуйста, посмотрите мои новые конкретные примеры (и да, я знаю, что ответ всегда «именно так, как он закодирован»; в конце концов, я программист. Я хочу знать интересные детали того, с чем вы часто сталкиваетесь.)
Edit3: В дальнейшем под "классом" я имею в виду экземпляр класса. Спасибо
Ошибка 1:
Значение указателя NULL, он же указатель == 0
- Управляемый код: создает исключение NullPointerException во время выполнения
- C ++:?
- Пример: Ну, да, у вас есть указатель на класс , но он инициализируется равным 0. Что происходит, когда вы отправляете его функции. то есть. C ++ не оставляет никаких указаний на класс; это просто объединение публичных "заполнителей".
Ошибка 2:
Указатель указывает на прежний класс в памяти, значение которого равно NULL или == 0
- Управляемый код: не разрешен для модели памяти. Все упомянутые объекты остаются в памяти. Нет исключительных случаев?
- C ++:?
- Пример: у вас был указатель на класс , и класс был удален. Затем вы передаете указатель в качестве аргумента функции. Очевидно, что проблема, которая возникает, зависит от того, как функция работает с указанным классом. Мой вопрос: есть ли отказоустойчивая обработка для этого на STL? Хорошая фирменная библиотека? Средний открытый исходный код?
Ошибка 3: указатель указывает на класс, который не является правильным классом или подклассом
- Управляемый код: выдает исключение ClassCastException.
- C ++: [исправить, если не так] Компилятор пытается бороться с этим, не допуская неудачных приведений. Однако, если это произойдет во время выполнения, я предполагаю неопределенное поведение. Существуют ли случаи подобных объектов класса, где это не всегда взрывается?
- Пример: ваш указатель переназначен неправильно, чтобы его значение было полностью равно другому классу. Я предполагаю, что функция, которой вы передаете этот ссылочный класс, просто слепо захватит смещение любых переменных экземпляра, на которые она ссылается. Таким образом, он неправильно интерпретирует необработанный двоичный файл. Нет способа предотвратить это в C ++? И / или ... есть ли случай, когда эта способность используется навсегда?
Ошибка 4: указатель указывает на середину класса (выровненный) или неинициализированный мусор
- Управляемый код: не разрешен моделью памяти.
- C ++: эквивалентно случаю 3?
- Пример: часто вы действительно используете это на законных основаниях. Например, вы можете получить доступ к массиву вектора STL напрямую - это указывает на середину класса. Тем не менее, кажется, что так же легко "пропустить"? Есть ли распространенная ловушка, в которой это может произойти против вашей воли, например, если загружена библиотека, отличная от той, с которой вы связаны (и есть ли механизм, предотвращающий это?)
Заранее спасибо всем участникам.