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
.