shared_ptr存储删除器如何?

Toc*_*cio 8 c++ generics function shared-ptr

我无法理解如何shared_ptr存储我给它的删除器.

最初,使用a shared_ptr<int>,我认为它可能会使用a std::function<void(int*)>,但我可以作为删除器给出任何类型的函数(或可调用对象),只要第一个参数是a int*.

怎么shared_ptr办呢?

我很抱歉,如果这是一个愚蠢的问题,我是C++的新手,请原谅我!

编辑:问题是:我怎么能做那样的事情?我该怎么用?任何例子?或者这是一个非常高级的话题?

Ker*_* SB 8

删除器以及分配器都是类型擦除的.共享指针管理动态分配的私有模板化控制对象,该对象通过多态基础访问,并存储所有特定于类型的状态和功能.

实现std::function使用类似的想法,因为它也是类型擦除动态管理器类,但两者通常完全分开实现.

结果是两个类都相对"昂贵",只应在它们真正必要时使用.否则,通常优选更便宜的非多态非动态解决方案.


Ben*_*igt 5

只要第一个参数是a,我就可以提供任何类型的函数(或可调用对象)作为删除器int*

不,不是。该std::shared_ptr构造具有以下的合同,在第20.8.2.2.1(中[util.smartptr.shared.const]):

template<class  Y,  class  D>  shared_ptr(Y*  p,  D  d);
template<class  Y,  class  D,  class  A>  shared_ptr(Y*  p,  D  d,  A  a);
template  <class  D>  shared_ptr(nullptr_t  p,  D  d);
template  <class  D,  class  A>  shared_ptr(nullptr_t  p,  D  d,  A  a);
Run Code Online (Sandbox Code Playgroud)

要求: p 应可转换为 T*D 应该是CopyConstructible的。的复制构造函数和析构函数 D 不得抛出异常。 该表达式 d(p) 应格式正确,行为应明确,并且不得抛出异常。A应该是分配器(17.6.3.5)。A的复制构造函数和析构函数不得抛出异常。

效果:构造一个shared_ptr拥有该对象p和Deleter 的对象d。第二个和第四个构造函数应使用的副本a为内部使用分配内存。

后置条件: use_count() == 1 && get() == p

抛出: bad_alloc,或者当无法获取除内存以外的资源时的实现定义的异常。

异常安全性:如果引发异常,d(p)则被调用。

此要求比删除程序的第一个参数必须为正确的类型强得多。它必须是唯一的参数(没有默认参数),这样才d(p)合法。这比灵活得多std::function<void (int*)>,因为返回类型可以是任何类型,但在异常保证方面也受到更多限制。

如果在为删除程序提供多个必需参数时编译器没有抓住您,则标准库实现做错了什么。

至于如何实现它,请利用它必须是CopyConstructible的事实。例如,以下lambda应该可以很好地工作,并且可以分配给它std::function<void(void)>(CopyConstructible保证可确保按值捕获有效):

[d, p] { d(p); }
Run Code Online (Sandbox Code Playgroud)