Какова правильная парадигма создания списка указателей в C ++?
Объедините std::list
(или, возможно, какой-то другой контейнер ) с некоторым умным указателем класса (см. здесь ), например std::shared_ptr
или std::unique_ptr
.
Как правило (иногда неправильно) избегайте необработанных указателей и предпочитайте умные указатели. Управление памятью это сложная тема. Если вы прочтете какую-нибудь книгу по сборке мусора (например, GC handbook ), вы изучите соответствующие концепции, терминологию и методы (и они применимы даже при ручном управлении памятью , например подсчет ссылок - который некоторые люди рассматривают как примитивную форму GC). Циркулярные ссылки больно обрабатывать (помните слабые ссылки , например, std::weak_ptr
).
Потребовалось бы лот пространства и времени, чтобы объяснить все это подробно (а у меня нет времени, мотивации или даже всех навыков для этого) здесь. Прочитайте хорошую книгу C ++ по программированию и обратитесь к справочнику C ++ (а позже, возможно, к C ++ 11 стандарту n3337 или к чему-то еще новее). Имейте в виду, что модель памяти из C ++ трудна для понимания (для всех).
Помните о правиле пяти .
В некоторых операционных системах и / или реализациях C ++ вы можете найти такие инструменты, как valgrind или адресное дезинфицирующее средство из Clang или GCC , который должен помочь вам отладить, а затем избежать утечек памяти (подробности зависят от компилятора и / или ОС). И в некоторых случаях (вероятно, в меньшинстве) вы можете рассмотреть возможность использования библиотеки сборщика мусора (например, Boehm's GC , см. this или MPS ).
Есть ли способ сделать это эффективно в C ++?
Я не знаю ни одного эффективного, универсального и простого способа (и теорема Райса заставляет меня поверить, что такого не может быть) для управления памятью. Ваш пробег будет варьироваться. Вы должны точно понимать управление памятью и другие программные ограничения и цели и делать свои собственные компромиссы. См. Мнение Норвиг . Существует Нет Серебряной пули .
PS. C ++ - чрезвычайно сложный язык программирования . Подготовьте себя к тому, чтобы тратить много времени (годы, а не месяцы; возможно, десятилетия) и усилия на его изучение. Для вдохновения посмотрите также на исходный код некоторого хорошо написанного свободного программного обеспечения , написанного на C ++. Я не претендую на звание мастера C ++ (даже если моя ежедневная работа заключается в разработке и реализации статического исходного кода анализаторы для него). Я считаю, что на этой планете может быть всего несколько десятков (или, возможно, несколько сотен) мастеров C ++, и я не среди них.
PPS. Я пристрастен, но я рекомендую использовать Linux на вашей машине для разработки, чтобы изучать программирование на C ++, именно потому, что в нем много полезных инструментов.