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,则直到处理完对象,可避免复制和析构.
引用计数文档

posted @   zjh6  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示