2 Stimmen

D struct-Speicherbehandlung - Rückgabe von "this" aus Mitgliedsfunktionen

uint ci = 0;

struct S
{
    uint i;

    this(int x)
    {
        i = ci;
        ci++;

        writeln("new: ", i);
    }

    this(this)
    {
        i = ci;
        ci++;

        writeln("copy ", i);
    }

    ~this()
    {
        writeln("del ", i);
    }

    S save1() // produces 2 copies in total
    {
        S s = this;
        return s;
    }

    auto save2() // produces 3 copies in total
    {
        S s = this;
        return s;
    }
}

Speichern1:

S s = S(1);
S t = S(1);

t = s.save1();

// Gives:
// new 0
// new 1
// copy 2
// del 1
// del 2
// del 0

Speichern2:

S s = S(1);
S t = S(1);

t = s.save2();

// Gives:
// new 0
// new 1
// copy 2
// copy 3
// del 3
// del 1
// del 3
// del 0

Wie Sie sehen können, löscht die save2()-Variante nie die Struktur mit i == 2. Ist das ein Speicherleck? Ich kann meine Ressourcen in structs nicht richtig verwalten, wenn ich auto als Rückgabetyp.

Auch, wenn save() einfach zurückgibt this ohne das Provisorium, bekomme ich:

S save()
{
    return this;
}

// new 0
// new 1
// copy 2
// del 1
// del 2
// del 2

Sind das Wanzen? Wie soll ich eine ordentliche Speicherverwaltung durchführen, wenn ich keinen Standardkonstruktor definieren kann? Was ist der Grund für diese Designentscheidung?

Ich möchte es für einen vorderen Bereich verwenden, also kann ich nicht class .

2voto

dsimcha Punkte 65784

Sieht für mich nach einem Fehler aus. Offenbar ist der einzige Unterschied zwischen save1 y save2 ist, dass letztere die auto anstelle eines expliziten Rückgabetyps. Mit Ausnahme einiger Eckfälle, die hier nicht zutreffen, sollte dies keine Auswirkungen auf postblit- und d'tor-Aufrufe haben.

1voto

Trass3r Punkte 5163

Der Teil mit dem falschen Code kann mit git dmd nicht reproduziert werden:

new: 0
new: 1
copy 2
del 1
del 2
del 0
-
new: 0
new: 1
copy 2
copy 3
del 2
del 1
del 3
del 0
-
new: 0
new: 1
copy 2
del 1
del 2
del 0

Ich habe die verbleibende NRVO-Ausgabe als http://d.puremagic.com/issues/show_bug.cgi?id=7353

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X