Указатели в C после удаления
В C управление памятью имеет решающее значение, и одним из ключевых аспектов является обработка указателей после удаления объекта. Следующий код вызывает вопросы о достоверности указателя после удаления:
A* a = new A();
A* b = a;
delete a;
A* c = a; // illegal in C 11
A* d = b; // is it legal?
Понимание действительности указателя после удаления
Согласно стандарту C, обращение к хранилищу, на которое указывает указатель, после удаления соответствующего объекта не определено и может привести к непредсказуемому поведению. Это относится как к исходному указателю (в данном случае a), так и к копиям этого указателя (b).
В C 11 доступ к значению a или b после удаления a является неопределенным поведением. Стандарт C 14 поясняет это поведение, заявляя, что оба действия имеют поведение, определяемое реализацией. Это означает, что результат зависит от конкретной реализации компилятора или среды выполнения.
Поведение, определяемое реализацией
Как упоминалось ранее, C 14 допускает использование недопустимых указателей ( включая копии удаленных указателей), чтобы иметь поведение, определяемое реализацией. Это означает, что разные компиляторы или операционные системы могут обрабатывать эти ситуации по-разному.
Некоторые реализации могут генерировать сгенерированную системой ошибку времени выполнения, в то время как другие могут демонстрировать непредсказуемое поведение или завершать программу. Поэтому важно избегать использования указателей, которые ссылаются на удаленные объекты, включая копии этих указателей.
Заключение
Подводя итог, доступ к значению указателя (или его копии) после удаления связанного объекта является опасным и может привести к неопределенному или определяемому реализацией поведению. Крайне важно гарантировать, что указатели всегда указывают на допустимые объекты, и правильно управлять памятью, чтобы предотвратить такие проблемы.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3