Pergunta

Eu tenho um ponteiro para uma QScriptEngine que eu estou passando pelo construtor da classe sobrecarregado de Evaluator eo atribui a QScriptEngine *engine_ classe (subclasses da classe Property Evaluator, e chama este construtor de Evaluator, passando-o um QScriptEngine já atribuídos). O construtor sem argumentos cria o novo ponteiro QScriptEngine (subclasses da classe Generic Evaluator desta forma). No teste destructor I se engine_ não é NULL, exclua o ponteiro, em seguida, atribuí-lo NULL. Se o ponteiro (engine_) na Property derivado agora também ser NULL? Algo me diz que este não é o caso. Se não, como você lida com esta situação? Preciso do QScriptEngine ser a mesma instância por toda parte. de QScriptEngine = operador é privado, ou eu estaria evitando o ponteiro todos juntos.

Eu vi algumas informações sobre ponteiros compartilhados (boost::shared_ptr e std:tr1::shared_ptr) em outra questão SO. Eu já estou usando o impulso para a biblioteca regex, de modo boost não é fora de questão se essa é a melhor maneira de lidar com isso. Esperemos que há um não-boost forma, para C ++ geral projetos de conhecimento e futuras.

Foi útil?

Solução

Você pode resolver isso, dando uma das classes (classe A) controle de tempo de vida de que ponteiro, juntamente com um método 'getter'. A outra classe (classe B) sempre chamar getter de A sempre que necessário o ponteiro. Dessa forma, um permanece no controle do ponteiro em todos os momentos. Desvantagem é a função getter (ele provavelmente irá em linha, mas ainda é um segundo indirecta). Além disso, B vai ter que verificar esse ponteiro para NULL em praticamente cada utilização.

Sua outra opção é para embrulhar o ponteiro em algo como boost :: shared_ptr que cuida do problema (se usado corretamente) mantendo o ponteiro subjacente, e só excluí-lo quando todos os objetos que compartilham esse ponteiro são excluídos. Você poderia escrever isso mesmo, mas desde que você já tem impulso no jogo, eu tinha acabado de usar a sua implementação.

Uma terceira opção é a re-fator a coisa toda de modo que você não precisa de um ponteiro compartilhado. Eu, pessoalmente, nunca projetar um programa C ++ que precisava ponteiros compartilhados, só porque é um local onde os erros de gerenciamento de memória poderia facilmente fluência ao longo dos anos, mas isso é só comigo.

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