d写行多次调用析构器
import std.stdio: writeln;
struct MyObject
{
int id;
this(int id) @nogc
{
this.id = id;
}
~this()
{
writeln("Object destructor ...");
}
}
void main()
{
auto obj = MyObject(42);
writeln("MyObject: ", obj);
writeln("Goodbye:\n");
}
这是因为writeln正在复制对象,并且析构了每个副本.如果添加复制构造器到示例中,会看见:
import std.stdio: writeln;
struct MyObject
{
int id;
this(int id) @nogc
{
this.id = id;
}
this(inout ref MyObject) inout
{
writeln("构造器");
}
~this()
{
writeln("析构器");
}
}
void main()
{
auto obj = MyObject(42);
writeln(obj);
writeln("Goodbye:\n");
}
最好是禁用复制和打印不是对象而是它的显式串表示:
@disable this(this);
string toString() const {
import std.format : format;
return format!"id: %s"(id);
}//加上.
writeln("MyObject: ", obj.toString);
如果你使用RefCounted,则直到处理完对象,可避免复制和析构.
引用计数文档
浙公网安备 33010602011771号