К объекту нельзя получить доступ за пределами его времени жизни
К объекту нельзя получить доступ за пределами его времени жизни.
Время жизни объекта начинается, когда оно создается его конструктором. Время жизни заканчивается, когда объект удален. При доступе к переменной перед ее конструкцией или после того, как ее разрушение может привести к неопределенному поведению. В зависимости от контекста много операций могут непреднамеренно получить доступ к объекту вне его времени жизни. Примеры таких операций включают:
Неинициализированный указатель: Вы можете непреднамеренно получить доступ к указателю прежде, чем присвоить адрес ему. Эта операция получает доступ к объекту перед своим временем жизни и приводит к доступу к непредсказуемой ячейке памяти. Лучшая практика состоит в том, чтобы инициировать указатель при помощи nullptr
во время его объявления.
Переменная Noninitialized: Вы можете непреднамеренно считать переменную, прежде чем она будет инициализирована. Эта операция получает доступ к объекту перед своим временем жизни и приводит к чтению значения мусора, которое непредсказуемо и бесполезно. Лучшая практика состоит в том, чтобы инициировать переменную во время своего объявления.
Использование ранее освобожденного указателя: Вы можете получить доступ к динамически выделенной памяти об указателе после освобождения памяти. Попытка получить доступ к этому блоку памяти получает доступ к объекту после своего времени жизни и приводит к непредсказуемому поведению или даже отказу сегментации. Чтобы решить эту проблему, установите освобожденный указатель на nullptr
, и затем проверять, является ли указателем nullptr
прежде, чем получить доступ к нему. В качестве альтернативы используйте std::unique_ptr
вместо необработанного указателя. Поскольку вы не должны освобождать выделенную память для std::unique_ptr
явным образом можно постараться не непреднамеренно получать доступ к освобожденной памяти.
Указатель или ссылка, чтобы сложить переменный осциллограф отъезда: Вы можете присвоить нелокальный указатель на локальный объект. Например:
Нелокальный или глобальный указатель присвоен переменной, которая локальна для функции.
Переданный ссылкой параметр функции, такой как указатель, присвоен переменной, которая локальна для функции.
Элемент данных указателя класса присвоен переменной, которая локальна для функции.
Если локальная переменная выходит из осциллографа, их соответствующие блоки памяти могут содержать мусор или непредсказуемые значения. Доступ к указателям на эти ячейки памяти получает доступ к объекту после своего времени жизни и может привести к неопределенному или непредсказуемому поведению. Лучшая практика не состоит в том, чтобы присвоить нелокальные указатели на локальные объекты.
Объект Modifying с временным временем жизни: Вы можете попытаться изменить временный объект, возвращенный вызовом функции. Изменение временных объектов является неопределенным поведением, которое может привести к аварийному завершению программы в зависимости от аппаратного и программного обеспечения, которое вы используете. Лучшая практика состоит в том, чтобы присвоить временные объекты в локальных переменных и затем изменение локальных переменных.
Избегайте операций, которые могут получить доступ к объекту за пределами его времени жизни.
Polyspace® проверяет на эти сценарии где объектная сила быть полученным доступ за пределами ее времени жизни:
Неинициализированный указатель: Polyspace отмечает указатель, если он не присвоен адрес, прежде чем к нему получат доступ.
Переменная Noninitialized: Polyspace отмечает переменную, если он не инициализируется, прежде чем ее значение читается.
Использование ранее освобожденного указателя: Polyspace отмечает операцию, где вы получаете доступ к блоку памяти после освобождения блока, например, при помощи free()
функционируйте или delete
оператор.
Указатель или ссылка, чтобы сложить переменный осциллограф отъезда: Polyspace отмечает локальную переменную, когда указатель или ссылка на него оставляют свой осциллограф. Например, локальная переменная отмечается когда:
Функция возвращает указатель на локальную переменную
Глобальный указатель указан на локальную переменную
Параметр функции передачи ссылкой, такой как указатель, указан на локальную переменную
Элемент данных указателя класса указан на локальную переменную
Объект Accessing с временным временем жизни: Polyspace отмечает операцию, где вы получаете доступ к временному объекту, который возвращен вызовом функции.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Фундаментальные понятия |
Категория: необходимый, неавтоматизированный |