Using `fetch_add(1, std::memory_order_relaxed)` to increment a shared reference count is correct, but the final DECREMENT that frees the object needs more than relaxed. Why?
// increment:
ref.fetch_add(1, std::memory_order_relaxed);
// decrement:
if (ref.fetch_sub(1, std::memory_order_???) == 1) {
delete obj;
}