关于关注的问题shared_ptr
构造函数:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
我是否正确,如果r
使用用户提供的删除器创建,然后使用别名shared_ptr
知道这一点。所以如果别名shared_ptr
是组中的最后一个并且(超出范围时)会破坏最初由r
,它会使用用户提供的删除器吗?
Example:
#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;
}
Output:
1
2
1
get_deleter == 0? false
my_deleter called!
注意:我无法使用自由函数编译这个示例my_deleter
,免费时存在一些铸造错误get_deleter
函数(尝试从void*
到带有 a 的函数指针类型static_cast
).
别名演员:
[util.smartptr.shared.const]/13-14
template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
13 Effects:构造一个shared_ptr
存储的实例p
and 股权 with r
.
14 后置条件: get() == p && use_count() == r.use_count()
带有用户提供的删除器的 Ctor:
[util.smartptr.shared.const]/9
模板shared_ptr(Y* p, D d);
Effects:构造一个shared_ptr
反对owns物体p
和删除器d
.
博士:
[util.smartptr.shared.dest]/1
〜shared_ptr();
1 Effects:
- If
*this
is empty或与他人共享所有权shared_ptr
实例 (use_count() > 1
),没有副作用。
- 否则,如果
*this
owns一个东西p
和一个删除器d
, d(p)
叫做。
- 否则,
*this
owns一个指针p
, and delete p
叫做。
将它们结合起来(让我们跳过赋值运算符):
- The
shared_ptr
实例r
owns对象和删除器。
- 别名 ctor 让新的
shared_ptr
实例股权 with r
(即对于对象和删除器两者)。
- When the dtor of this new instance is called (or an assignment operator),
- If
use_count > 1
,没有影响。
- 否则,这个例子owns该对象
r
指向and删除器(如果有)并且将使用此删除器(如果存在)或delete
在所指向的对象上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)