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:

Ich muss initialisierenb 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:

Ich habe nur Kontrolle über A. Ich habe keine Kontrolle über B und ich habe keine Kontrolle über die Benutzer von A.Ich möchte den Code so sauber und lesbar wie möglich halten.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage