Как правильно поместить умный указатель в данные класса (в качестве члена класса) в C++?
Предположим, у меня есть класс Boda:
class Boda {
...
};
И у меня есть член cydo
в этом классе я хочу быть умным указателем (то есть я хочу, чтобы он автоматически освобождался, как только класс был уничтожен).
Я использую умные указатели Boost, поэтому я пишу:
class Boda {
boost::shared_ptr<int> cydo;
public:
Boda () {
cydo = boost::shared_ptr<int>(new int(5));
}
};
Правильно ли использовать умные указатели в качестве учеников?
Спасибо, Бода Кидо.
2 ответа
class Boda {
boost::shared_ptr<int> cydo;
public:
Boda () : cydo(new int(5)) {}
};
Хотя я не могу понять, почему вы хотите обернуть int
...:)
Реальный вопрос, который вы должны задать себе, заключается в том, нужно ли выделять участника отдельно от класса. Обычно лучше, если вы просто сохраните член в классе - по сравнению с хранением любого типа указателя. Если вы не можете сделать это, если, например, время жизни элемента начинается до или после создания контейнера, может быть расширено за пределы владения элементом, которое может быть передано другим объектам, тогда вы должны использовать указатели.
Если вам нужно использовать указатели, вы должны предпочесть умные указатели необработанным указателям и выбрать конкретный тип в соответствии с вашими требованиями. Если принадлежность члена не должна использоваться совместно с другими объектами, но вам необходимо использовать указатель, поскольку время жизни содержащегося объекта может начинаться до или после срока службы контейнера, или если владение может быть передано другим объектам, но управление ресурс (если не получен) является исключительной ответственностью контейнера, а затем unique_ptr
или же auto_ptr
,
Если содержащийся объект не принадлежит исключительно этому классу, используйте shared_ptr
, Это также можно использовать, если элемент используется разными потоками, причем каждый поток содержит свой собственный shared_ptr
даже если владение принадлежит только одному из потоков, чтобы избежать уничтожения объекта в одном потоке, когда он все еще используется в другом.