Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

Зачем нужны умные, мудрые и пр. указатели в С++



Зачем нужны эти самые умные, мудрые и пр. типы 'указателей'?
В каких конкретно случаях нужно применять эти конкретные типы? В чем разница между ними?
Имеет ли смысл самому реализовать эти концепции на практике или использовать готовые варианты из boost? В чем преимущество этих вариантов?
    


Ответы

Ответ 1



Благодаря умным указателям можно избежать утечек памяти и обеспечить безопасное ее использование. Если честно, то нет таких ситуаций в которых не нужно было бы применять умных указателей Вопрос скорее нужно поставить так - какой тип умного указателя нужно применить в той или иной ситуации? Всегда нужно начинать с готовых классов, но бывают ситуации когда подцеплять к проект столь громоздкую библиотеку, как boost просто невозможно по техническим причинам. таких ситуациях выручает собственный класс, но нужно понимать что это будет скорее всего частный случай реализации умного указателя и конкурировать с библиотечным типом он сможет только в этом проекте.

Ответ 2



Приведу простой пример, для илюстрации необходимости умных указателей. Вот такой участок кода: A* a = new A(); B* b = new B(); C* c = new C(); doSomething(a, b, c); delete a; delete b; delete c; небезопасен, если конструкторы могут кидать исключения. Безопасныйый код выглядит примерно так: A* a = new A(); B* b; try { b = new B(); } catch (...) { delete a; throw; } C* c; try { c = new C(); } catch (...) { delete a; delete b; throw; } try { doSomething(a, b, c); } catch (...) { delete a; delete b; delete c; throw; } delete a; delete b; delete c; что выглядит достаточно громоздко. С использованием же умных указателей получится: std::unique_ptr a(new A()); std::unique_ptr b(new B()); std::unique_ptr c(new C()); doSomething(a.get(), b.get(), c.get());

Ответ 3



Итак, получается, что умные указатели нужны, чтобы обойти ограничения, получаемые при использовании классических указателей C++. Преимущества использования умных указателей: Автоматическая инициализация. Автоматическая очистка. Отсутствие проблем с указателями на уже удаленные объекты. Умные указатели - exception safe С помощью умных указателей можно реализовать алгоритмы сборки мусора. Которые в С++ изначально отсутствуют. Возможность повысить эффективность кода при наличии доп. информации об объектах на которые необходимо ссылаться

Комментариев нет:

Отправить комментарий