Меры предосторожности при использовании указателей? [Дубликат]

0

Указатели являются ядром для языков программирования, таких как C и C++. Это в то же время приводит к многочисленным ошибкам и утечкам памяти. Каковы некоторые меры предосторожности, которые должны выполняться при использовании указателей на C и C++?

  • 3
    Использование указателей как таковых не приводит к утечкам памяти.
  • 1
    @PawełStawarz PawełStawarz - нет, это «много ошибок и», что приводит к утечкам. :-)
Показать ещё 12 комментариев
Теги:
pointers

3 ответа

1
  • Всегда инициализировать их
  • Проверьте границы (размер смещения указателя/индекс)
  • free память, когда закончите
  • Установите NULL после освобождения
  • Убедитесь, что они не являются NULL перед доступом
  • Когда вы malloc, используйте thing = malloc(N * sizeof *thing)
  • Не перезаписывайте указатель, который был malloc до его free.
  • ...
  • 1
    Вы должны изменить последний на «не перезаписывать указатель, не освободив его первым»
  • 0
    @BWG - ты понял.
Показать ещё 4 комментария
1

Некоторые хорошие советы там в комментариях и ответ Флорис, но ИМО "Не использовать указатели" не является одним из них

shared_ptrs отлично подходят для защиты от утечек, но вы не всегда можете их использовать. Например, вы не должны использовать их с boost :: intrusive container.

Кроме того, shared_ptrs не поможет вам, если у вас есть контейнер с указанными shared_ptrs, и вы просто добавляете, но никогда не удаляете из контейнера. Вы по-прежнему "утечка" ресурсов, хотя вы не потеряли возможность его удалить.


другие разные подсказки:

Как и во всех ресурсах, мне лучше всего свести к минимуму пути кода, по которым один тип может быть выделен и освобожден, чтобы я мог сопоставить их в обзоре и/или инструментах.

при распределении c-строк не забудьте зарезервировать место для вашего терминатора

  • 1
    «не используйте указатели» - действительно глупый и слишком узкий совет !!
  • 1
    @ πάνταῥεῖ - я думаю, что nhed говорит: «из всех хороших советов,« не используйте указатели »не один из них». И он продолжает уточнять эту позицию. Итак, вы оба согласны, хотя ваш комментарий выглядит так, как будто вы думаете, что не согласны.
Показать ещё 6 комментариев
1

Указатели являются ядром для языков программирования, таких как C и C++.

Не "указатели" обязательно, пусть говорят о ссылках...

Обратите внимание (!), Что роль "указателей" радикально изменилась, когда речь идет о парадигмах, используемых в vs. (особенно для языковых стандартов ). Таким образом, было бы трудно справиться с ними одинаково,

Что касается :

Использование указателей "raw" категорически не рекомендуется с программированием в C++, по крайней мере, когда они должны динамически распределяться с помощью new() или new[]() (которые являются основной причиной подверженности памяти утечки в ваших приложениях).

В использование ссылки (см. Операции & и &&), которые недоступны для , является предпочтительным, когда это возможно (поскольку они не могут привести к такой вещи, как "оборванная ссылка" против " висячий указатель ').

Принцип, введенный в , называется RAII и управляет временем жизни любых экземпляров класса, главным образом, из областей стека вызовов любых функций и путей выполнения (независимо от того, вызваны ли они в том же потоке или нет). Я не говорю, что это невозможно реализовать с помощью простого , но это сложнее и подвержено ошибкам.

В приложении C++ правильное управление памятью для экземпляров класса, выделенного кучей, должно выполняться с помощью средств интеллектуального указателя или, по крайней мере, для использования старого старого (тем временем, устаревшего) std::auto_ptr для pre C++ 11 стандартов.

Каковы некоторые меры предосторожности, которые должны выполняться при использовании указателей на C и C++?

Конечно, есть некоторые варианты использования указателей на raw в C++ (особенно при взаимодействии между c и C++ API), но вы всегда должны проверять их достоверность и хорошо знать, что вы на самом деле делаете! Все остальные случаи хорошо освещены стандартами C++, и вам просто нужно будет использовать правильный стандартный класс интеллектуальных указателей, чтобы избавиться от ваших проблем.

  • 0
    Этот ответ просто путаница
  • 0
    @ DieterLücking Это так? Я хотел бы улучшить его, потому что я вижу некоторые отличия рекомендуемой обработки ссылок в c и c ++ в целом. Не могли бы вы уточнить, какие именно моменты нужно улучшить (для аспекта с ++ я уже упоминал в начале).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню