Wie vermeide ich aufeinanderfolgende Freigabe / Zuweisung in C ++?
Betrachten Sie den folgenden Code:
class A
{
B* b; // an A object owns a B object
A() : b(NULL) { } // we don't know what b will be when constructing A
void calledVeryOften(…)
{
if (b)
delete b;
b = new B(param1, param2, param3, param4);
}
};
Mein Ziel: Ich muss die Leistung maximieren, was in diesem Fall bedeutet, die Menge der Speicherzuweisungen zu minimieren.
Hier ist es naheliegend, sich zu ändernB* b;
zuB b;
. Ich sehe zwei Probleme mit diesem Ansatz:
b
im Konstruktor. Da weiß ich nicht wasb
Dies bedeutet, dass ich Dummy-Werte an den Konstruktor von B übergeben muss. Welches, IMO, ist hässlich.ImcalledVeryOften()
Ich muss so etwas machen:b = B(…)
, was aus zwei Gründen falsch ist:Der Zerstörer vonb
wird nicht angerufen.Eine temporäre Instanz von B wird erstellt und dann kopiertb
, dann wird der Destruktor der temporären Instanz aufgerufen. Das Kopieren und der Destruktoraufruf könnten vermieden werden. Schlimmer noch, wenn Sie den Destruktor aufrufen, kann dies zu unerwünschtem Verhalten führen.Welche Lösungen muss ich also vermeiden?new
? Bitte beachten Sie, dass: