создать два объекта shared_ptr из одного указателя - PullRequest
4 голосов
/ 16 мая 2009

У меня проблема из "Расширения стандартной библиотеки C ++":

Упражнение 6
Я сказал в разделе 2.4.2 что вы не должны строить два shared_ptr объекты из того же указатель. Опасность в том, что оба объекты shared_ptr или их потомство в конечном итоге попытаться удалить ресурс, и это обычно приводит к беда. На самом деле, вы можете сделать это, если ты осторожен Это не особо полезно, но написать программу, которая строит два shared_ptr объекты из тот же указатель и удаляет ресурс только один раз.

ниже мой ответ:

template <typename T>
void nonsence(T*){}
struct SX {
     int data;
     SX(int i = 0) :
              data(i) {
              cout << "SX" << endl;
     }
     ~SX() {
              cout << "~SX" << endl;
     }
};
int main(int argc, char **argv) {
    SX* psx=new SX;
    shared_ptr<SX> sp1(psx),sp2(psx,nonsence<SX>);
    cout<<sp1.use_count()<<endl;
    return 0;
}

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

Ответы [ 4 ]

3 голосов
/ 18 мая 2009

Все, что вам нужно сделать, это построить второй shared_ptr из первого shared_ptr.

shared_ptr<SX> sp1( new SX );
shared_ptr<SX> sp2( sp1 );

Созданный SX будет затем надлежащим образом удален, только когда все общие указатели на него будут уничтожены.

2 голосов
/ 16 мая 2009

Трюк, который вы нашли, действителен, но бесполезен. Центральная особенность shared_ptr - подсчет ссылок, который вы здесь подменяете. Инструмент удаления (второй аргумент конструктора) предназначен для использования shared_ptr с ресурсами, отличными от простых указателей. Вы можете использовать его с файлами, например:


typedef boost::shared_ptr FilePtr;
void FileClose( FILE* pf ) { if ( pf ) fclose( pf ); }
FilePtr pfile( fopen( "filename" ), FileClose );

То же самое с соединениями с базой данных, сокетами и т. Д. И т. Д. И RAII в общем.

1 голос
/ 16 мая 2009

Вы можете посмотреть, как boost решает проблему с shared_from_this . Вот код .

0 голосов
/ 22 мая 2009

Я получил ответ «СТАНДАРТ» от boost doc: http://www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp

...