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.

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top