Skip to content

Commit 455910e

Browse files
authored
Make more shared_ptr fixes (#1401)
* Make refcount reads explicitly atomic * Consistently put `const` in the same place * Write the general `operator=` on `weak_ptr`
1 parent 9c68bc1 commit 455910e

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

ctl/shared_ptr.h

+11-4
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ class shared_ref
9797

9898
size_t use_count() const noexcept
9999
{
100-
return shared + 1;
100+
return __atomic_load_n(&shared, __ATOMIC_RELAXED) + 1;
101101
}
102102

103103
size_t weak_count() const noexcept
104104
{
105-
return weak;
105+
return __atomic_load_n(&weak, __ATOMIC_RELAXED);
106106
}
107107

108108
private:
@@ -382,15 +382,15 @@ class weak_ptr
382382
rc->keep_weak();
383383
}
384384

385-
weak_ptr(weak_ptr const& r) noexcept : p(r.p), rc(r.rc)
385+
weak_ptr(const weak_ptr& r) noexcept : p(r.p), rc(r.rc)
386386
{
387387
if (rc)
388388
rc->keep_weak();
389389
}
390390

391391
template<typename U>
392392
requires __::shared_ptr_compatible<T, U>
393-
weak_ptr(weak_ptr<U> const& r) noexcept : p(r.p), rc(r.rc)
393+
weak_ptr(const weak_ptr<U>& r) noexcept : p(r.p), rc(r.rc)
394394
{
395395
if (rc)
396396
rc->keep_weak();
@@ -444,6 +444,13 @@ class weak_ptr
444444
return *this;
445445
}
446446

447+
template <typename U>
448+
requires __::shared_ptr_compatible<T, U>
449+
weak_ptr& operator=(weak_ptr<U> r) noexcept
450+
{
451+
weak_ptr<T>(move(r)).swap(*this);
452+
}
453+
447454
shared_ptr<T> lock() const noexcept
448455
{
449456
if (expired())

0 commit comments

Comments
 (0)