Defer

The defer keyword runs a statement when leaving the current scope. It’s usually used to clean up or release some resource.

We can use it to run code at the end of a function:

const std = @import("std");
const print = std.debug.print;

fn f() void {
    defer print("defer in f\n", .{});
    print("in f\n", .{});
}

pub fn main() void {
    f();
}
$ zig run defer.zig 
in f
defer in f

A deferred statement will always run at the end of the block:

const std = @import("std");
const print = std.debug.print;

fn g() void {
    {
        defer print("defer in block\n", .{});
        print("in block\n", .{});
    }

    for (1..4) |i| {
        defer print("defer in iteration {}\n", .{i});
        print("in iteration {}\n", .{i});
    }
}

pub fn main() void {
    g();
}
$ zig run blocks.zig 
in block
defer in block
in iteration 1
defer in iteration 1
in iteration 2
defer in iteration 2
in iteration 3
defer in iteration 3

Multiple deferred statements run in reverse order:

const std = @import("std");
const print = std.debug.print;

pub fn main() void {
    defer print("defer #1\n", .{});
    defer print("defer #2\n", .{});
    defer print("defer #3\n", .{});
}
$ zig run order.zig
defer #3
defer #2
defer #1

Next example: Errdefer.