Я очень хорошо знаком с указателями.
Существует семантическое различие между указателями, которые просто указывают на объекты в автоматическом хранилище («стек»), и указателями на объекты в свободном хранилище («куча») в том, что указатели на объекты в куче должны в некоторых случаях точка, используемая для освобождения (delete
/ delete[]
) памяти, ранее выделенной с помощью new
(или new[]
).
Это не просто легко забыть, но нельзя сделать, если между распределением и освобождением возникает исключение. Чтобы сделать это проще, были изобретены умные указатели, которые следуют RAII / RDID -idiom («Приобретение ресурса - инициализация / уничтожение ресурса - удаление»): необработанные указатели инкапсулированы в объектах, которые управляют временем жизни ресурса. они справляются.
Это позволяет во многих обстоятельствах избегать следования правилу 3/5 (что в современном C ++ больше соответствует правилу большой четверки (с половиной) ) но вместо этого используйте правило нуля .
Кроме того, нет смысла иметь указатель на std::vector<>
, поскольку векторы дешевы для копирования (по сравнению с неудобством управления динамически выделяемой памятью).
Так что вместо
std::vector<Pair *> *artistAttributes;
лучше использовать
std::vector<std::shared_ptr<Pair>> artistAttributes;