Nuovo operatore pubblico, eliminazione operatore privato: ottenere C2248 & # 8220; impossibile accedere al membro privato & # 8221; quando si utilizza nuovo

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

Domanda

Una classe ha sovraccaricato gli operatori new e delete . new è pubblico, delete è privato.

Quando costruisco un'istanza di questa classe, ottengo il seguente errore:

pFoo = new Foo(bar)

esempio.cpp (1): errore C2248: 'Foo: operator delete': impossibile accedere a un membro privato dichiarato nella classe 'Foo'

Ma qui non c'è chiamata a delete , quindi cosa sta succedendo nella mente contorta del compilatore? :)

  1. Qual è la ragione dell'errore?
  2. È possibile risolvere il problema senza ricorrere alla funzione CreateInstance di un membro?
È stato utile?

Soluzione

Quando si esegue nuovo Foo () , accadono due cose: il primo operatore nuovo viene richiamato per allocare memoria, quindi un costruttore per Foo è chiamato. Se viene lanciato quel costruttore, poiché non è possibile accedere alla memoria già allocata, il runtime C ++ se ne occuperà passandolo all'appropriato operatore delete . Ecco perché devi sempre implementare un operatore eliminato corrispondente per ogni operatore nuovo che scrivi ed è per questo che deve essere accessibile.

Come via d'uscita potresti renderli entrambi privati ??e invocare operatore nuovo da una funzione di membro pubblico (come create () ).

Altri suggerimenti

Controlla questo . In uno dei paragrafi inferiori si afferma che il nuovo richiede l'eliminazione per essere accessibile. Fondamentalmente dice che puoi solo creare oggetti nell'heap, se puoi anche cancellarli di nuovo.

Secondo gli standard C ++, quando si ha una classe con allocazione dinamica della memoria e si genera un'eccezione all'interno del costruttore, la memoria deve essere liberata per evitare perdite di memoria.

Qui hai definito il tuo nuovo operatore come pubblico, ma elimina è privato.

Quindi il compilatore ti sta dicendo che mi danno accesso all'operatore di eliminazione in modo che io possa farlo prevenire la perdita di memoria se viene generata un'eccezione nel costruttore.

Se non definisci il tuo operatore di eliminazione, anche il compilatore genererà un errore e ti costringerà a definirlo.

  • " 1. Qual è il motivo dell'errore? "

    la risposta di sbi è buona.

  • " 2.È possibile risolvere il problema senza ricorrere alla funzione CreateInstance di un membro? "

    Sì. Crea distruttore privato.

Chiamando l'operatore nuovo sulla classe verrà utilizzata anche l'eliminazione della classe se il costruttore della classe genera un'eccezione.

Se la tua libreria non utilizza eccezioni, puoi disabilitare le eccezioni dal compilatore " -fno-exceptions " ;, quindi l'errore non verrà più visualizzato. (In Visual Studio risiede sotto " C / C ++ " ;, " Code Generation " ;, " Enable C ++ Exceptions " > " No (-fno-exceptions) ")

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top