Operador público operador de novo, privado de exclusão: recebendo C2248 “não pode acessar membro privado” ao usar nova
-
10-07-2019 - |
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? :)
- O que é a razão para o erro?
- É possível resolver o problema, sem recorrer a uma função membro
CreateInstance
?
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)")