Trong quản lý bộ nhớ bằng đếm tham chiếu (reference counting), mỗi đối tượng lưu một bộ đếm số lượng con trỏ đang trỏ tới nó (refcount). Khi refcount về 0, đối tượng bị giải phóng ngay lập tức.
Xét n biến con trỏ đánh số 1..n, ban đầu tất cả trỏ tới NULL (không trỏ tới đối tượng nào). Các đối tượng ở đây không chứa trường trỏ tới đối tượng khác (đối tượng lá), refcount chỉ tăng/giảm do gán biến.
Có q câu lệnh, mỗi câu lệnh là một trong ba dạng:
NEW v x: tạo đối tượng mới có định danh x (số nguyên dương, không trùng với bất kỳ định danh nào đã xuất hiện trước đó) và gán biến v trỏ tới x (refcount(x) khởi tạo =1). Nếu trước đó v đang trỏ tới một đối tượng y, refcount(y) giảm 1; nếu về 0, y bị giải phóng.COPY v1 v2: gán v1 trỏ tới đối tượng mà v2 đang trỏ (nếu v2 là NULL thì v1 cũng thành NULL). Refcount đối tượng mới (nếu có) tăng 1 TRƯỚC, sau đó refcount đối tượng cũ của v1 (nếu có) giảm 1 và giải phóng nếu về 0 (thứ tự này đảm bảo trường hợp v1, v2 cùng trỏ một đối tượng không bị giải phóng nhầm).CLEAR v: gán v = NULL; refcount đối tượng cũ (nếu có) giảm 1, giải phóng nếu về 0.Ví dụ: n=3, các lệnh NEW 1 100, COPY 2 1, NEW 1 200, CLEAR 2, NEW 3 300, COPY 2 3, CLEAR 3 cho ra: đối tượng 100 bị giải phóng (khi NEW 1 200 không giảm hết vì còn biến 2 giữ, nhưng CLEAR 2 mới thực sự giải phóng nó); cuối cùng còn sống 200 và 300.
Dòng đầu: hai số nguyên n, q (1≤n≤1000, 0≤q≤2000).
q dòng tiếp theo, mỗi dòng là một lệnh NEW v x, COPY v1 v2 hoặc CLEAR v (1≤v,v1,v2≤n; 1≤x≤109).
In 2 dòng:
Với ví dụ trên, kết quả là:
100
200 300
Ví dụ:
Đầu vào:
3 7
NEW 1 100
COPY 2 1
NEW 1 200
CLEAR 2
NEW 3 300
COPY 2 3
CLEAR 3
Đầu ra:
100
200 300
Đầu vào:
1 2
NEW 1 10
CLEAR 1
Đầu ra:
10
Đang tải editor...