Существуют две концепции (владение, время жизни), которые важны при использовании интеллектуальных указателей C ++ (уникальные, общие, слабые). Я пытаюсь понять эти концепции и то, как они влияют на использование интеллектуальных указателей (или необработанных указателей).
Я прочитал два правила:
- Всегда используйте умные указатели для управления владением / временем жизни динамического объекты.
- Не используйте умные указатели, когда не управляете владением / временем жизни.
Пример:
class Object
{
public:
Object* child(int i) { return mChildren[i]; }
// More search and access functions returning pointers here
private:
vector<Object*> mChildren;
};
Я хочу переписать это с помощью умных указателей , Давайте сначала проигнорируем child (). Простая игра. Родитель владеет своими детьми. Поэтому сделайте mChildren вектором unique_ptr.
Согласно вышеупомянутым правилам, некоторые люди утверждают, что child (i) должен продолжать возвращать необработанный указатель.
Но разве это не рискованно? Кто-то может делать глупые вещи, такие как удаление возвращаемого объекта, что затрудняет отладку cra sh ... которого можно избежать, используя в качестве возвращаемого значения слабый_птр или shared_ptr.
Нельзя ли сказать, что копирование указатель всегда означает временное разделение владельца и / или утверждение срока жизни объекта?
Стоит ли использовать умные указатели для детей, только если я не получаю более безопасный API?