Есть ли класс умного указателя наддува, который можно настроить, чтобы он не удалялся при уничтожении? - PullRequest
4 голосов
/ 20 июля 2009

У меня есть список умных указателей. Я хочу, чтобы некоторые из этих умных указателей действовали как обычные указатели, то есть они просто являются ссылкой на экземпляр и не участвуют в его освобождении. Например, они могут указывать на экземпляры, расположенные в стеке. Другие умные указатели в списке должны действовать как обычные boost :: shared_ptr.

Вот как может выглядеть класс:

template<class T> smart_ptr {
private:
    T *p;
    boost::shared_ptr<T> sp;
public:
    smart_ptr(T *p): p(p), shared(0) { } // p will not be deleted
    smart_ptr(boost::shared_ptr<T> &sp): p(sp.get()), sp(sp) { }
    T *get() const { return p; }
}

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

Ответы [ 4 ]

13 голосов
/ 20 июля 2009

Один конструктор для shared_ptr принимает метод деструктора, и вы можете передать пустой функтор.

Использование пользовательского Deallocator в boost :: shared_ptr

(Вы хотите просто пустую функцию.)

3 голосов
/ 20 июля 2009

В моем наборе инструментов есть маленький класс для этого:

struct nodelete {
    template <typename T>
    void operator()( T * ) {}
};

Использование:

int main() {
    SomeClass sc;
    boost::shared_ptr<SomeClass> p( &sc, nodelete() );
    // ...
}
1 голос
/ 20 июля 2009

Это звучит как повышение :: слабый_птр: http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/weak_ptr.htm

Но вы можете создать слабый_птр только из shared_ptr, так что для ваших объектов, размещенных в стеке, я не уверен, как это будет работать.

0 голосов
/ 11 марта 2010

Это пахнет плохим дизайном.

Я не могу придумать разумную ситуацию, когда вы не хотите удалять указатель. Вот (неразумные ИМО) ситуации:

1) объекты статической длительности. Вместо этого рассмотрите возможность использования синглтонного миксина (используйте CRTP для микширования синглтона, у которого есть метод instance (), который возвращает копию локального статического shared_ptr <>; локальная статика является потокобезопасной, поэтому вам также потребуется соответствующий статический мьютекс, если это может вызываться несколькими потоками). Преимущество использования правильного синглтона состоит в том, что ваш синглтон будет разрушен при выходе после других объектов, которые продолжают удерживать shared_ptr <>.

2) объекты, созданные в стеке. Просто не делай этого. Вместо этого создайте объект в куче, защищенной shared_ptr <>. Если вам нужно создать shared_ptr <> для объекта в разных частях кода (то есть вы не можете получить копии из оригинального shared_ptr <>), тогда наследуйте от boost :: enable_shared_from_this <> и получите shared_ptr <> s из shared_from_this ().

Есть ли другая причина, по которой вам нужен shared_ptr <>, который никогда ничего не удаляет?

...