Operador público nuevo, operador privado eliminado: obtener C2248 “no puede acceder a miembro privado” cuando usa nuevo

Una clase ha sobrecargado operadores new y delete . new es público, delete es privado.

Cuando construyo una instancia de esta clase, obtengo el siguiente error:

 pFoo = new Foo(bar) 

example.cpp (1): error C2248: ‘Foo: operator delete’: no ​​se puede acceder al miembro privado declarado en la clase ‘Foo’

Pero no hay una llamada para delete aquí, entonces, ¿qué está pasando en la retorcida mente del comstackdor? 🙂

  1. ¿Cuál es la razón del error?
  2. ¿Es posible resolver el problema sin recurrir a una función CreateInstance miembro?

Cuando haces un new Foo() , suceden dos cosas: el primer operator new se invoca para asignar memoria, luego se llama a un constructor para Foo . Si ese constructor lanza, ya que no puede acceder a la memoria ya asignada, el tiempo de ejecución de C ++ se encargará de pasarlo al operator delete apropiado operator delete . Es por eso que siempre debe implementar una operator delete coincidente para cada operator new que escriba y es por eso que debe ser accesible.

Como salida, podría hacer que ambos sean privados e invocar al operator new desde una función de miembro público (como create() ).

Mira esto En uno de los párrafos inferiores, dice que lo nuevo requiere que se elimine para poder acceder. Básicamente dice que solo puedes crear objetos en el montón, si también puedes borrarlos de nuevo.

Según los estándares de C ++, cuando tiene una clase con asignación dinámica de memoria y se genera una excepción dentro del constructor, la memoria debe liberarse para evitar memory leaks.

Aquí ha definido su propio operador nuevo como público, pero eliminar es privado.

Así que el comstackdor le dice que me dé acceso al operador de eliminación para que pueda evitar la pérdida de memoria si se produce alguna excepción en el constructor.

Si no define su operador de eliminación, entonces también el comstackdor dará un error y lo forzará a definirlo.

  • “1. ¿Cuál es el motivo del error?”

    La respuesta de sbi es buena.

  • “2. ¿Es posible resolver el problema sin recurrir a una función CreateInstance miembro?”

    Sí. Crear destructor privado.