Operador público nuevo, eliminar operador privado: obtener C2248 & # 8220; no se puede acceder al miembro privado & # 8221; cuando se usa nuevo

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

Pregunta

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

Al construir una instancia de esta clase, aparece el siguiente error:

pFoo = new Foo(bar)

example.cpp (1): error C2248: 'Foo: operador eliminar': no ??se puede acceder al miembro privado declarado en la clase 'Foo'

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

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

Solución

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

Como salida, puede hacer que ambos sean privados e invocar al operador new desde una función miembro pública (como create () ).

Otros consejos

Marque esto . En uno de los párrafos inferiores dice que nuevo requiere eliminar para ser accesible. Básicamente dice que solo puede crear objetos en el montón, si también puede eliminarlos nuevamente.

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

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

Entonces el compilador le dice que me dé acceso para eliminar el operador para que pueda evitar pérdidas de memoria si se genera alguna excepción en el constructor.

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

  • " 1.¿Cuál es la razón del error? "

    La respuesta de

    sbi es buena.

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

    Sí Crear destructor privado.

Al llamar al operador new on class se usará también delete class si el constructor de la clase arroja una excepción.

Si su biblioteca no usa excepciones, puede deshabilitar las excepciones del compilador '' -fno-excepciones '', entonces el error ya no aparecerá. (En Visual Studio reside en '' C / C ++ '', '' Generación de código '', '' Habilitar excepciones de C ++ '' > '' No (-fno-excepciones) '')

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top