Как правильно поместить умный указатель в данные класса (как член класса) в C ++? - PullRequest
2 голосов
/ 14 августа 2010

Предположим, у меня есть класс Бода:

class Boda {
    ...
};

И у меня есть член cydo в этом классе, который я хочу быть умным указателем (то есть я хочу, чтобы он автоматически освобождался, как только класс будет уничтожен).

Я использую умные указатели Boost, поэтому я пишу:

class Boda {
    boost::shared_ptr<int> cydo;
    public:
        Boda () {
            cydo = boost::shared_ptr<int>(new int(5));
        }
};

Правильно ли использовать умные указатели для учеников?

Спасибо, Бода Чидо.

Ответы [ 2 ]

10 голосов
/ 14 августа 2010
class Boda {
    boost::shared_ptr<int> cydo;
    public:
        Boda () : cydo(new int(5)) {} 
};

Хотя, я не могу понять, почему вы хотите обернуть int ...:)

2 голосов
/ 14 августа 2010

Реальный вопрос, который вы должны задать себе, заключается в том, нужно ли вам выделять участника отдельно от класса.Обычно лучше, если вы просто сохраните член в классе - по сравнению с хранением любого типа указателя.Если вы не можете сделать это, если, например, время жизни элемента начинается до или после создания контейнера, может быть расширено за пределы владения членом, может быть уступлено другим объектам, тогда вы должны использовать указатели.

Когда вам нужно использовать указатели, вы должны предпочесть умные указатели необработанным указателям и выбрать конкретный тип в соответствии с вашими требованиями.Если принадлежность члена не должна использоваться совместно с другими объектами, но вам нужно использовать указатель, потому что время жизни содержащегося объекта может начинаться до или после срока службы контейнера, или если право собственности может быть передано другим объектам, но управлениеза ресурс (если он не получен) является исключительной ответственностью контейнера, тогда предпочитайте unique_ptr или auto_ptr.

Если содержащийся объект не принадлежит исключительно этому классу, тогда используйте shared_ptr.Это также можно использовать, если элемент используется разными потоками, причем каждый поток имеет свой собственный shared_ptr, даже если владение принадлежит только одному из потоков, чтобы избежать уничтожения объекта в одном потоке, когда он все еще используется.в другом.

...