stl1weekend
stl1weekend copied to clipboard
Build your own STL in one weekend
_uninit_assign 进行构造时,节点数在while之后n变为0后赋值给m_size,应为while之前赋值。
比如reverse_iterator rend() noexcept { return std::make_reverse_iterator(_M_elements); } 这里写成了return std::make_reverse_iterator(_M_elements + _N);
gcc13.1 -std=c++20 部分报错信息如下: https://godbolt.org/z/KzGoGbdvK error: no matching function for call to 'forward(main()::&)' 29 | explicit _FuncImpl(std::in_place_t, _CArgs &&...__args) : _M_f(std::forward(__args)...) {} GPT:std::make_unique 尝试调用 _FuncImpl 的构造函数时,传递的参数类型不匹配导致的。 确保 _FuncImpl 的构造函数能够正确处理函数指针的引用。通过添加一个额外的构造函数来处理。 能编译通过的代码:https://godbolt.org/z/h4KMKoMYc
sharedptr引用计数减被封装成如下的函数 ```c++ void _M_decref() noexcept { if (_M_refcnt.fetch_sub(1, std::memory_order_relaxed) == 1) { delete this; } } ``` 该if块先判断原始引用计数是否等于1,如果为真则进行delete。然而判断和delete是两个操作,并不是一个原子操作。是否存在这样一种情况:判断条件成立,但在delete前有其它线程给引用计数+1?此时进行delete就出错了吧
sensi,貌似少了一个return *this
1. 返回值 2. 自赋值安全性
https://github.com/parallel101/stl1weekend/blob/9c394fd48e1d69cb7686a420fc9e57161ad0acb6/SharedPtr.hpp#L18C1-L20C6 标准库里面释放管理的指针和控制块直接使用了 acq_rel fence的,这里直接用relaxed order不会有问题吗? 标准库实现如下: 考虑如下case, thread 1为最终减到1的thread, thread 2为减到2的 thread。thread 1最终释放资源。 ``` void thread1(shared_ptr ptr) { // ... if (ptr.counter.fetch_sub(1, relaxed) == 1) // Will be true delete...