Linux программирование в примерах
Шрифт:
Представленные здесь шаги являются стереотипными. Порядок следующий:
1. Объявить указатель соответствующего типа для выделенной памяти.
2. Вычислить размер выделяемой памяти в байтах. Для этого нужно умножить число нужных объектов на размер каждого из них. Последний получается с помощью оператора С
При выделении массивов для строк символов или других данных типа
3. Выделить память с помощью
Обратите внимание, что на C++ присвоение знамения указателя одного типа указателю другого типа требует приведения типов, какой бы ни был контекст. Для управления динамической памятью программы C++ должны использовать
4. Проверить возвращенное значение. Никогда не предполагайте, что выделение памяти было успешным. Если выделение памяти завершилось неудачей,
Если вы проверите возвращенное значение, вы можете по крайней мере выдать диагностическое сообщение и корректно завершить программу. Или можете попытаться использовать какой-нибудь другой способ восстановления.
Выделив блок памяти и установив в
Компилятор создает корректный код для индексирования через указатель при получении доступа к членам структуры
ЗАМЕЧАНИЕ. Блок памяти, возвращенный
Другой возможностью является использование
Джефф Колье (Geoff Collyer) рекомендует следующую методику для выделения памяти:
Этот подход гарантирует, что
3.2.1.3. Освобождение памяти:
Когда вы завершили использование памяти, «верните ее обратно», используя функцию
После вызова f
Доступ к освобожденной памяти
Если она не была освобождена, переменная
Освобождение одного и того же указателя дважды
Это создает «неопределенное поведение». После передачи блока памяти обратно выделяющим процедурам они могут объединить освобожденный блок с другой свободной памятью, которая есть в их распоряжении. Освобождение чего-то уже освобожденного ведет к неразберихе и в лучшем случае к крушению; известно, что так называемые двойные освобождения приводили к проблемам безопасности.
Передача указателя, полученного не от функций
Это кажется очевидным, но тем не менее важно. Плоха даже передача указателя на адрес где-то в середине динамически выделенной памяти:
Этот вызов не будет работать и, возможно, приведет к пагубным последствиям, таким как крушение. (Это происходит потому, что во многих реализациях
Американский таблоид
Детективы:
крутой детектив
рейтинг книги
Самурай. Трилогия
Фантастика:
боевая фантастика
рейтинг книги
Вечный. Книга V
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
рейтинг книги
Энциклопедия философских наук. Часть первая. Логика
1. Собрание сочинений в 14 томах
Научно-образовательная:
философия
рейтинг книги
Основные произведения иностранной художественной литературы. Азия. Африка
Научно-образовательная:
языкознание
литературоведение
рейтинг книги
Дарт Вейдер. Ученик Дарта Сидиуса
Звездные войны
Фантастика:
социально-философская фантастика
космическая фантастика
рейтинг книги
Рыцарь из ниоткуда. Сборник
Сварог
Фантастика:
фэнтези
попаданцы
рейтинг книги
Я снова князь. Книга XXIII
23. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
рейтинг книги
Рокоссовский: терновый венец славы
Русские полководцы
Документальная литература:
биографии и мемуары
рейтинг книги
Глаза тьмы
3. Хроники Эрсы
Фантастика:
фэнтези
рейтинг книги