Operador público operador de novo, privado de exclusão: recebendo C2248 “não pode acessar membro privado” ao usar nova

StackOverflow https://stackoverflow.com/questions/1820069

Pergunta

A classe tem sobrecarregado operadores new e delete. new é público, delete é privado.

Ao construir uma instância dessa classe, eu recebo o seguinte erro:

pFoo = new Foo(bar)

example.cpp (1): Erro C2248: 'Foo: operador delete': não é possível acessar membro particular declarado na classe 'Foo'

Mas não há nenhuma chamada para delete aqui, então o que está acontecendo na mente distorcida do compilador? :)

  1. O que é a razão para o erro?
  2. É possível resolver o problema, sem recorrer a uma função membro CreateInstance?
Foi útil?

Solução

Quando você faz new Foo() seguida, acontecem duas coisas: Primeiro operator new é chamado para alocar memória, em seguida, um construtor para Foo é chamado. Se esse construtor lançará, desde que você não pode acessar a memória já alocada, o tempo de execução C ++ vai cuidar dele, passando-o para o operator delete apropriado. É por isso que você sempre deve implementar um operator delete correspondência para cada operator new você escreve e é por isso que ele precisa para ser acessível.

Como uma maneira de sair você pode fazer ambos privado e invocar operator new de uma função de membro pública (como create()).

Outras dicas

Verifique este . Em um dos parágrafos mais baixas diz que novo exige de exclusão a ser acessível. Basicamente, ele diz, você só pode criar objetos na pilha, se você também pode excluí-los novamente.

De acordo com as Normas C ++, Quando você tem classe com alocação de memória dinâmica e uma exceção dentro do construtor, a memória tem de ser liberado para vazamentos de memória evitar.

Aqui você definiu é proprietário do New operador público, mas de exclusão é privado.

Assim compilador está lhe dizendo que me dá acesso a operador delete para que eu possa vazamento de memória prevent se alguma exceção é gerada no construtor.

Se você não definir o seu operador de exclusão, então também compilador dará um erro e forçá-lo a defini-lo.

  • "1.O que é a razão para o erro?"

    resposta da SBI é bom.

  • "2.Is possível para resolver o problema, sem recorrer a uma função membro CreateInstance?"

    Sim. Criar destructor privado.

Chamando operador de novo no classe usará também da classe de exclusão se construtor da classe gera uma exceção.

Se a sua biblioteca não utiliza exceções, você pode desativar exceções de compilador "-fno-exceções", então erro não aparecerá mais. (Em reside Visual Studio em "C / C ++", "Code Generation", "Ativar Exceções C ++"> "Não (-fno-exceções)")

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