shared_ptr别名构造函数
shared_ptr aliasing constructor
关于以下shared_ptr
构造函数的问题:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
我是否正确,如果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;
}
输出:
121get_deleter == 0?假my_deleter打电话!注
:注:我无法使用自由函数my_deleter
编译此示例,自由get_deleter
函数存在一些转换错误(尝试从void*
转换为带有static_cast
的函数指针类型(。
别名控制:[util.smartptr.shared.const]/13-14
template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
13 效果:构造一个存储
p
并与r
共享所有权的shared_ptr
实例。14 后置条件:
get() == p && use_count() == r.use_count()
带有用户提供的删除器的 Ctor:[util.smartptr.shared.const]/9
模板shared_ptr(Y* p, D d(;
效果:构造一个
shared_ptr
对象,该对象拥有对象p
和删除程序d
。
多托:[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
同时拥有对象和删除程序。- 别名 ctor 允许新的
shared_ptr
实例与r
共享所有权(即对象和删除器(。 - 当调用此新实例的 dtor(或赋值运算符(时,
- 如果
use_count > 1
,则没有效果。 - 否则,此实例拥有
r
指向的对象和删除程序(如果有(,并将使用此删除器(如果存在(或delete
指向的对象。
- 如果
是的,因为删除器存储在shared_ptr的计数器中("pn"成员boost::detail::shared_count
(,并且别名实际上共享计数器。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 通过类型别名从构造函数转发模板推导
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 在模板派生类中继承具有类型别名的构造函数
- 使用使用成员类型别名的构造函数来推论类模板参数
- 如何自己为我自己的shared_ptr实现实现别名构造函数
- 将共享指针的别名构造函数与空共享指针一起使用C++
- 使用 std::weak_ptr 和别名构造函数中断循环引用:声音或有问题
- shared_ptr别名构造函数
- 为什么 std::unique_ptr 没有像 std::shared_ptr 那样的别名构造函数?
- 为什么在使用可变构造函数时必须创建类型别名
- 为什么 std::shared_ptr 的别名构造函数不初始化 std::enabled_shared_from_this?
- 在不同的命名空间中调用别名声明的基类构造函数