Das Problem besteht darin, dass ein rohes neu gibt kein Eigentumsrecht an. Wenn ich ein Objekt neu erstelle und es zurückgebe, wem gehört es? Besitzt die Erstellungsfunktion/das Objekt sie, oder funktioniert die aufrufende Funktion? Wenn Sie Smartpointer (std :: shared_ptr und std :: unique_ptr) zurückgeben, geben Sie den Besitz an.
Nicht spezifiziert Eigentum ist eine der einfachsten Möglichkeiten, Speicher zu verlieren. Ich habe die schwierigste Zeit, sogar mit professionellen Programmierern, Leute dazu zu bringen, Besitz zu verstehen und damit zu arbeiten. Dies wird meist durch die Verwendung von guten Typen (Smartpointern) verhindert, die den Besitz angeben, nur indem sie existieren.
type* function(); // Unspecified ownership.
// Must be well documented and all users must read
// and follow the documentation.
std::unique_ptr<type> function(); // Calling function owns returned pointer.
// Single ownership.
std::shared_ptr<type> function(); // Calling function owns returned pointer.
// Shared ownership. Can have multiple owners.
std::weak_ptr<type> function(); // Calling function references returned pointer.
// Must lock pointer to get owned object, if not deleted.
// Shared ownership. Can have multiple owners.
Diese verschiedenen Arten von Zeigern drücken Besitz nur durch existierende im Gegensatz zu rohen Zeigern aus.
Wie für new
immer falsch. Das ist eine generelle Verallgemeinerung.std::shared_ptr
wird mit der globalen Funktion std::make_shared
erstellt. Ab C++ 11 gibt es keine std::make_unique
, aber das wird in C++ 14 behoben werden. Die einzige Möglichkeit, ein std::unique_ptr
zu erstellen, ist die Verwendung von new und sofort zuweisen Sie den Zeiger auf std::unique_ptr
.
Es gibt auch Orte, wo Sie einen rohen Zeiger und manuell new
und delete
verwenden möchten, aber sie neigen dazu, sehr niedrigen Pegel zu sein, und die meisten Programmierer werden sie selten begegnen.
Was mir wirklich über Ihren Code kriechend hat, ist nicht, dass Sie new
verwenden, aber dass Sie die Zeiger sind dereferencing und es zu einem Referenz zuweisen. Es wäre fast unmöglich zu garantieren, dass der Destruktor jemals aufgerufen wird. Es neigt auch dazu, Speicher zu verlieren, obwohl im Fall der Zuweisung zu einer statischen Variable wird es bei Programmbeendigung freigegeben werden, so dass Sie nicht wirklich Speicherleck suchen.
MyClass& MyClass::MyInstance()
{
static MyClass & myLocalVariable = * new MyClass(/*parameters*/);
return myLocalVariable ;
}
Ich würde lieber erstellen, um die statische Variable nach Wert als durch Referenz zu haben. Dies verhindert, dass das Objekt auf den Heap gesetzt wird. Abhängig von MyClass
ist es auch möglich, das Objekt aus der ausführbaren Datei in den Speicher zu mappen, ohne dass ein Code zur Initialisierung ausgeführt werden muss.
MyClass& MyClass::MyInstance()
{
static MyClass myLocalVariable(/*parameters*/);
return myLocalVariable ;
}
Wie genau wird das gelöscht? – Nim
In der origianl Frage habe ich auch über die Verwendung eines std :: shared_ptr statt eines Vanille-Pointer –
erzählt Wenn Sie 'neu', müssen Sie' löschen'. In diesem Fall können Sie nicht. – crashmstr