2009-05-16 4 views
3

У меня есть проблема с "The C++ Standard Library Extensions":построить два shared_ptr объектов из того же указателя

Упражнение 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; 
} 

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

+0

вам не хватает «{» в конструкторе SX. (Просто быть педантичным) –

ответ

1

Вы можете посмотреть, как boost решает его с помощью shared_from_this. Вот code.

+0

thx много. Я нахожу, что повышение sovle эта проблема: http: //www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp. почти такой же, как у меня. еще раз спасибо. – cnheying

2

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


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

же соединений с базами данных, розетки и т.д. и т.п. и RAII в целом.

3

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^