关于关注shared_ptr
构造函数的问题:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
我是否正确如果r
是使用用户提供的删除器创建的,则别名shared_ptr
知道这一点。因此,如果别名shared_ptr
是组中的最后一个,并且(当超出范围时)销毁最初由r
管理的资源,它将使用该用户提供的删除器吗?
答案 0 :(得分:5)
示例:
#include <iostream>
#include <iomanip>
struct some_type
{
int i;
};
void my_deleter(some_type* p)
{
std::cout << "my_deleter called!" << std::endl;
delete p;
}
#include <memory>
int main()
{
std::shared_ptr<int> pm;
{
// Note: better use make_shared
auto x = new some_type;
// create a shared_ptr that owns x and a deleter
std::shared_ptr<some_type> r(x, &my_deleter);
std::cout << r.use_count() << std::endl;
// share ownership of x and the deleter with pm
pm = std::shared_ptr<int>(r, &r->i);
std::cout << r.use_count() << std::endl;
// r gets destroyed
}
std::cout << pm.use_count() << std::endl;
std::cout << "get_deleter == 0? " << std::boolalpha
<< (nullptr == std::get_deleter<decltype(&my_deleter)>(pm))
<< std::endl;
}
输出:
1 2 1 get_deleter == 0? false my_deleter called!
N.B。我无法使用自由函数my_deleter
编译此示例,对于免费get_deleter
函数存在一些转换错误(尝试从void*
转换为函数指针输入static_cast
)。
别名ctor: [util.smartptr.shared.const] / 13-14
template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
13 效果:构建一个
shared_ptr
实例,用p
存储r
和共享所有权。14 后置条件:
get() == p && use_count() == r.use_count()
使用用户提供的删除器的Ctor: [util.smartptr.shared.const] / 9
模板shared_ptr(Y * p,D d);
效果:构造拥有对象
shared_ptr
和删除者p
的{{1}}对象。
析构函数: [util.smartptr.shared.dest] / 1
〜shared_ptr的();
1 效果:
- 如果
d
为空或与另一个*this
实例(shared_ptr
)共享所有权,则无副作用。- 否则,如果
use_count() > 1
拥有对象*this
和删除者p
,则会调用d
。- 否则,
d(p)
拥有指针*this
,并调用p
。
组合这些(让我们跳过赋值运算符):
delete p
实例shared_ptr
拥有对象和删除者。r
实例与shared_ptr
共享所有权(即对象和删除者)。r
,则无效。use_count > 1
指向和删除器(如果有)的对象,并将使用此删除器(如果存在)或指向对象的r
。答案 1 :(得分:0)
是的,因为删除器存储在shared_ptr的计数器中('pn'成员if (userGroup == 1)
{
divUserGroup1.Visible = true;
}
else if (userGroup == 2)
{
divUserGroup2.Visible = true;
}
),并且别名实际上共享计数器。