Öffentlicher Operator neue private Betreiber löschen: C2248 immer „nicht privat Mitglied zugreifen können“, wenn neue Verwendung

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

Frage

Eine Klasse hat Operatoren new und delete überlastet. new ist öffentlich, delete privat ist.

Wenn Sie eine Instanz dieser Klasse konstruieren, bekomme ich folgende Fehlermeldung:

pFoo = new Foo(bar)

example.cpp (1): Fehler C2248: 'Foo: operator delete': kann nicht privat Mitglied Zugriff auf in der Klasse 'Foo' erklärt

Aber es gibt keinen Anruf hier delete, so etwas in dem verdrehten Geist des Compilers ist da los? :)

  1. Was ist der Grund für den Fehler?
  2. Ist es möglich, das Problem ohne Rückgriff auf ein Mitglied CreateInstance Funktion zu lösen?
War es hilfreich?

Lösung

Wenn Sie das tun new Foo() dann passieren zwei Dinge: Erstens operator new Speicher zuweisen aufgerufen wird, dann wird ein Konstruktor für Foo aufgerufen. Wenn das Konstruktor wirft, da Sie nicht auf den Speicher bereits zugeordnet zugreifen können, wird die C ++ Runtime kümmern sich um sie, indem sie an den entsprechenden operator delete vorbei. Deshalb sollten Sie immer eine passende operator delete für jeden operator new implementieren müssen Sie schreiben, und deshalb muss es zugänglich sein.

Als Ausweg könnte man beide privat machen und ruft operator new von einer öffentlichen Member-Funktion (wie create()).

Andere Tipps

Überprüfen Sie diese . In einem der unteren Absätzen heißt es, dass neue zugänglich sein erfordert löschen. Im Grunde sagt er, nur Objekte auf dem Heap erstellen können, wenn Sie diese auch wieder löschen können.

Wie pro C ++ Standards, wenn Sie Klasse mit dynamisch Speicherzuordnung haben und eine Ausnahme innerhalb Konstruktor angehoben, Speicher freigegeben werden muss, Speicherlecks zu vermeiden.

Hier haben Sie definieren Sie besitzen neue Betreiber als öffentliches, sondern löschen ist privat.

So Compiler sagt Ihnen, die den Zugriff geben Sie mir Operator zu löschen, so dass ich Speicherverlust verhindern, wenn eine Ausnahme im Konstruktor erhöht wird.

Wenn Sie nicht Ihre delete-Operator definieren, dann auch Compiler einen Fehler geben und zwingen Sie es zu definieren.

  • "1. Was ist der Grund für den Fehler?"

    sbi Antwort ist gut.

  • "2.Is es möglich, das Problem ohne Rückgriff auf ein Mitglied CreateInstance Funktion zu lösen?"

    Ja. Erstellen privaten destructor.

Berufung Operator neu auf Klasse verwendet auch Klasse löschen, wenn Klasse Konstruktor eine Ausnahme auslöst.

Wenn die Bibliothek keine Ausnahmen verwendet, Sie Ausnahmen von Compiler „-fno-Ausnahmen“ deaktivieren können, dann Fehler wird nicht mehr angezeigt. (In Visual Studio befindet sich unter "C / C ++", "Code Generation", "Enable C ++ Ausnahmen"> "Keine (-fno-Ausnahmen)")

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top