2009-11-30 18 views
19

Una clase ha sobrecargado los operadores new y delete. new es público, delete es privado.Operador público nuevo, operador privado eliminar: obtener C2248 "no se puede acceder al miembro privado" cuando se usa el nuevo

Cuando se construye una instancia de esta clase, me sale el siguiente error:

pFoo = new Foo(bar) 

example.cpp (1): error C2248: 'Foo: operador delete': no ​​se puede miembro privado de acceso declarado en la clase 'Foo'

Pero no hay una llamada al delete aquí, entonces, ¿qué está pasando en la retorcida mente del compilador? :)

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

Respuesta

26

Cuando hace new Foo(), suceden dos cosas: Primero se invoca operator new 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 ello pasándolo al operator delete apropiado. Es por eso que siempre debe implementar un operator delete coincidente para cada operator new que escriba y es por eso que debe ser accesible.

Como salida, puede hacer que ambas sean privadas e invocar operator new desde una función de miembro público (como create()).

3

Compruebe this. 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.

2

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 fugas de memoria.

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

Así que el compilador 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 compilador dará un error y lo forzará a definirlo.

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

    La respuesta de sbi es buena.

  • "2. ¿Es posible resolver el problema sin recurrir a la función CreateInstance de un miembro?"

    Sí. Crear destructor privado.

+0

El problema con 2.es que la clase se puede heredar y su destructor se puede redefinir como público accidentalmente. – Marius

+0

Cualquier clase con destructor privado no se puede heredar. –

Cuestiones relacionadas