sil*_*ket 2 c++ swap boost shared-ptr
据我所知,分配的共享ptr应该表现如下:
一个) if (--this->count == 0) { release this->count and this->obj }
b) this->count = r->count, this->obj = r->obj;
提升的作用是什么
shared_ptr & operator=( shared_ptr const & r ) BOOST_NOEXCEPT
{
this_type(r).swap(*this);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
那么交换背后的魔力又是什么呢?
a)if(--this-> count == 0){release this-> count and this-> obj}
不,a shared_ptr保持两个计数,一个用于对象,一个用于包含引用计数的控制块.this->obj当第一个达到零时释放,当第二个达到零时释放this->count(和第二个计数).
b)this-> count = r-> count,this-> obj = r-> obj;
不,您错过了引用计数增量.此外,正如Yakk的回答所指出的那样,你必须先检查自我分配或增加右侧,以避免在自我分配时错误地破坏对象.
所以你的理解是不完整/不正确的,但如果你遵循Boost代码,你会发现它完全正确.它增加了r对象的引用计数,交换了所有必要的值,然后减少了原始值的引用计数*this.
增加引用计数的步骤已在复制构造函数中实现,因此它会重复使用它.
交换所有必要值的步骤已在swap成员中实现,因此它使用它.
减少引用计数(并在需要时释放任何内容)的步骤已由析构函数完成,因此它使用它.
这是优秀的代码重用.另一种方法是重复所有与复制构造函数,交换成员和析构函数相同的代码,这些代码将是冗余且容易出错的.
| 归档时间: |
|
| 查看次数: |
830 次 |
| 最近记录: |