Указатели являются ядром для языков программирования, таких как C и C++. Это в то же время приводит к многочисленным ошибкам и утечкам памяти. Каковы некоторые меры предосторожности, которые должны выполняться при использовании указателей на C и C++?
free
память, когда закончитеNULL
после освобожденияNULL
перед доступомthing = malloc(N * sizeof *thing)
malloc
до его free
.Некоторые хорошие советы там в комментариях и ответ Флорис, но ИМО "Не использовать указатели" не является одним из них
shared_ptrs отлично подходят для защиты от утечек, но вы не всегда можете их использовать. Например, вы не должны использовать их с boost :: intrusive container.
Кроме того, shared_ptrs не поможет вам, если у вас есть контейнер с указанными shared_ptrs, и вы просто добавляете, но никогда не удаляете из контейнера. Вы по-прежнему "утечка" ресурсов, хотя вы не потеряли возможность его удалить.
другие разные подсказки:
Как и во всех ресурсах, мне лучше всего свести к минимуму пути кода, по которым один тип может быть выделен и освобожден, чтобы я мог сопоставить их в обзоре и/или инструментах.
при распределении c-строк не забудьте зарезервировать место для вашего терминатора
Указатели являются ядром для языков программирования, таких как C и C++.
Не "указатели" обязательно, пусть говорят о ссылках...
Обратите внимание (!), Что роль "указателей" радикально изменилась, когда речь идет о парадигмах, используемых в c vs. c++ (особенно для языковых стандартов c++11). Таким образом, было бы трудно справиться с ними одинаково,
Что касается c++:
Использование указателей "raw" c категорически не рекомендуется с программированием в C++, по крайней мере, когда они должны динамически распределяться с помощью new()
или new[]()
(которые являются основной причиной подверженности памяти утечки в ваших приложениях).
В c++ использование ссылки (см. Операции &
и &&
), которые недоступны для c, является предпочтительным, когда это возможно (поскольку они не могут привести к такой вещи, как "оборванная ссылка" против " висячий указатель ').
Принцип, введенный в c++, называется RAII и управляет временем жизни любых экземпляров класса, главным образом, из областей стека вызовов любых функций и путей выполнения (независимо от того, вызваны ли они в том же потоке или нет). Я не говорю, что это невозможно реализовать с помощью простого c, но это сложнее и подвержено ошибкам.
В приложении C++ правильное управление памятью для экземпляров класса, выделенного кучей, должно выполняться с помощью средств интеллектуального указателя c++11 или, по крайней мере, для использования старого старого (тем временем, устаревшего) std::auto_ptr
для pre C++ 11 стандартов.
Каковы некоторые меры предосторожности, которые должны выполняться при использовании указателей на C и C++?
Конечно, есть некоторые варианты использования указателей на raw в C++ (особенно при взаимодействии между c и C++ API), но вы всегда должны проверять их достоверность и хорошо знать, что вы на самом деле делаете! Все остальные случаи хорошо освещены стандартами C++, и вам просто нужно будет использовать правильный стандартный класс интеллектуальных указателей, чтобы избавиться от ваших проблем.