Một chiến lược quản lý bộ nhớ tự động phổ biến trong các máy ảo (như CPython) là đếm tham chiếu (reference counting): mỗi đối tượng trên heap giữ một bộ đếm số lượng biến/thanh ghi đang trỏ tới nó; khi bộ đếm giảm về 0, đối tượng lập tức bị giải phóng (không cần đợi một chu kỳ thu gom rác riêng).
Xét một máy ảo có N thanh ghi gốc (root) đánh số 0,…,N−1, ban đầu đều không trỏ tới đối tượng nào. Các đối tượng trên heap được đảm bảo không chứa trường tham chiếu tới đối tượng khác (chỉ các thanh ghi mới trực tiếp giữ tham chiếu), do đó không xảy ra hiện tượng giải phóng dây chuyền hay chu trình tham chiếu. Chương trình gồm M lệnh, mỗi lệnh là một trong ba dạng sau (x,y là chỉ số thanh ghi):
NEW x: cấp phát một đối tượng mới trên heap (ID của đối tượng là số thứ tự cấp phát, đánh số tăng dần từ 1, không bao giờ trùng hay tái sử dụng), rồi gán thanh ghi x trỏ tới đối tượng mới này (bộ đếm tham chiếu của đối tượng mới bắt đầu là 1). Nếu trước đó thanh ghi x đang trỏ tới một đối tượng khác, bộ đếm của đối tượng cũ đó giảm đi 1.MOVE x y: thanh ghi x được gán trỏ tới cùng đối tượng mà thanh ghi y đang trỏ tới (hoặc không trỏ tới gì nếu y đang không trỏ tới đối tượng nào). Nếu đối tượng mới mà x trỏ tới có tồn tại, bộ đếm của nó tăng 1; nếu thanh ghi x trước đó đang trỏ tới một đối tượng khác, bộ đếm đối tượng cũ đó giảm 1.CLEAR x: thanh ghi x được gán thành không trỏ tới đối tượng nào; nếu trước đó nó đang trỏ tới một đối tượng, bộ đếm đối tượng đó giảm 1.Ngay sau bất kỳ thao tác nào làm bộ đếm tham chiếu của một đối tượng giảm về đúng 0, đối tượng đó bị giải phóng ngay lập tức. Hãy in ra ID của các đối tượng bị giải phóng, theo đúng thứ tự thời điểm chúng bị giải phóng trong quá trình thực thi tuần tự các lệnh (mỗi lệnh làm giảm bộ đếm của tối đa một đối tượng cũ, nên không có hai đối tượng nào bị giải phóng đồng thời bởi cùng một lệnh).
Ví dụ: với N=1, các lệnh NEW 0 rồi CLEAR 0: đối tượng ID 1 được tạo (bộ đếm 1), sau đó CLEAR 0 làm bộ đếm về 0 và bị giải phóng — in ra 1.
NEW x, MOVE x y, hoặc CLEAR x đúng cú pháp mô tả ở trên (0≤x,y<N).In ra, mỗi dòng một số nguyên, là ID của một đối tượng bị giải phóng, theo đúng thứ tự các sự kiện giải phóng xảy ra khi thực thi tuần tự các lệnh. Nếu không có đối tượng nào bị giải phóng, không in gì.
Ví dụ:
Đầu vào:
1 2
NEW 0
CLEAR 0
Đầu ra:
1
Đầu vào:
2 4
NEW 0
MOVE 1 0
CLEAR 0
CLEAR 1
Đầu ra:
1
Đang tải editor...