这是什么技术问题std::shared_ptr::unique()是它在C++ 17中被弃用的原因?
根据cppreference.com,std::shared_ptr::unique()在C++ 17中被弃用
从C++ 17开始不推荐使用此函数,因为
use_count它只是多线程环境中的近似值.
我理解这是真的use_count() > 1:虽然我拿着它的引用,但其他人可能会同时放弃他或创建一个新副本.
但是如果use_count()返回1(这是我在调用时感兴趣的话unique())那么就没有其他线程可以以一种活泼的方式改变这个值,所以我希望这应该是安全的:
if (myPtr && myPtr.unique()) {
//Modify *myPtr
}
Run Code Online (Sandbox Code Playgroud)
我发现这个文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0521r0.html建议弃用以回应C++ 17 CD评论CA 14,但我找不到评论本身.
作为替代方案,该文件建议增加一些说明,包括以下内容:
注意:当多个线程可以影响返回值时
use_count(),结果应视为近似值.特别是,use_count() == 1并不意味着通过先前破坏的访问shared_ptr在任何意义上都已完成. - 结束说明
我理解这可能use_count()是当前指定方式的情况(由于缺乏保证的同步),但为什么分辨率不仅仅是指定这样的同步并因此使上述模式安全?如果有一个基本的限制,不允许这种同步(或使其成本高昂),那么如何才能正确实现析构函数?
我忽略了@ alexeykuzmin0和@rubenvb提出的明显案例,因为到目前为止我只unique()在shared_ptr其他线程本身无法访问的实例上使用过.因此,没有任何危险,特定的实例将以一种活泼的方式被复制.
我仍然有兴趣了解CA 14究竟是什么,因为我相信unique()只要保证与shared_ptr其他线程上的不同实例发生的任何事情同步,我的所有用例都会起作用.所以它对我来说似乎仍然是一个有用的工具,但我可能会忽略一些基本的东西.
为了说明我的想法,请考虑以下事项:
class MemoryCache {
public:
MemoryCache(size_t size)
: …Run Code Online (Sandbox Code Playgroud)