construir dois objectos shared_ptr do mesmo ponteiro
-
22-08-2019 - |
Pergunta
Eu tenho um problema de "The C ++ biblioteca padrão Extensões":
Exercício 6
Eu disse na Seção 2.4.2 que você não deve construir dois shared_ptr objetos a partir da mesma ponteiro. O perigo é que tanto objetos shared_ptr ou seus descendentes acabará por tentar excluir o recursos, e que normalmente leva à problema. Na verdade, você pode fazer isso se você tiver cuidado. Não é particularmente útil, mas escrever um programa que constrói dois shared_ptr objetos de o mesmo ponteiro e exclui o recursos apenas uma vez.
Abaixo está a minha resposta:
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;
}
mas eu não acho que é uma boa solução - porque eu não quero resolvê-lo pelo construtor uso. Alguém pode me dar um melhor? thx, perdoa meu mau Inglês.
Solução 4
Eu tenho a resposta "PADRÃO" de impulso doc: http: // www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp
Outras dicas
Tudo que você precisa fazer é construir a segunda shared_ptr
do primeiro shared_ptr
.
shared_ptr<SX> sp1( new SX );
shared_ptr<SX> sp2( sp1 );
O SX criado, então, ser adequadamente eliminada somente quando todos os ponteiros compartilhada para que sejam destruídas.
O truque que você encontrou é válida, embora inútil. A característica central do shared_ptr
é de contagem de referência, o que você subverter aqui. O deleter (o segundo argumento construtor) está lá para usar shared_ptr
com outros recursos, em seguida, os ponteiros simples. Você poderia usá-lo com arquivos, por exemplo:
typedef boost::shared_ptr FilePtr;
void FileClose( FILE* pf ) { if ( pf ) fclose( pf ); }
FilePtr pfile( fopen( "filename" ), FileClose );
Mesmo com conexões de banco de dados, tomadas, etc. etc. e RAII em geral.
Você pode olhar como reforço resolve-lo com shared_from_this . Aqui está o código .