gpt4 book ai didi

c++ - shared_ptr 别名构造函数

转载 作者:可可西里 更新时间:2023-11-01 16:39:58 27 4
gpt4 key购买 nike

关于以下 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? falsemy_deleter called!

注意我无法使用免费函数 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 Effects: Constructs a shared_ptr instance that stores p and shares ownership with r.

14 Postconditions: get() == p && use_count() == r.use_count()

带有用户提供的删除器的 Ctor:[util.smartptr.shared.const]/9

template shared_ptr(Y* p, D d);

Effects: Constructs a shared_ptr object that owns the object p and the deleter d.

医生:[util.smartptr.shared.dest]/1

~shared_ptr();

1 Effects:

  • If *this is empty or shares ownership with another shared_ptr instance (use_count() > 1), there are no side effects.
  • Otherwise, if *this owns an object p and a deleter d, d(p) is called.
  • Otherwise, *this owns a pointer p, and delete p is called.

结合这些(让我们跳过赋值运算符):

  • shared_ptr 实例 r 拥有对象和删除器。
  • 别名构造函数让新的 shared_ptr 实例r 共享所有权(即对象和删除器)。<
  • 当调用这个新实例的 dtor(或赋值运算符)时,
    • 如果 use_count > 1,则没有效果。
    • 否则,此实例拥有 r 指向的对象 删除器(如果有)并且将使用此删除器(如果它存在)或在指向的对象上删除

关于c++ - shared_ptr 别名构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19102034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com