use*_*436 9 c++ shared-ptr c++11
关于以下shared_ptr构造函数的问题:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
Run Code Online (Sandbox Code Playgroud)
我是否更正,如果r是使用用户提供的删除器创建的,那么别名就shared_ptr知道了.因此,如果别名shared_ptr是组中的最后一个,并且(当超出范围时)破坏最初由其管理的资源r,它将使用该用户提供的删除器吗?
例:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1 2 1 get_deleter == 0? false my_deleter called!
注意我无法使用自由函数编译此示例,自由函数my_deleter存在一些转换错误get_deleter(尝试void*使用a转换为函数指针类型static_cast).
别名ctor:[util.smartptr.shared.const]/13-14
Run Code Online (Sandbox Code Playgroud)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
template shared_ptr(Y*p,D d);
效果:构造一个
shared_ptr该对象拥有的对象p和删除器d.
Dtor:[util.smartptr.shared.dest]/1
〜shared_ptr的();
1 效果:
- 如果
*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指向的对象和删除器(如果有),并将使用此删除器(如果存在)或delete指向的对象.| 归档时间: |
|
| 查看次数: |
2410 次 |
| 最近记录: |