C++ Memory::get_deleter



C++ Memory::get_deleter 对于创建客户端代码共享指针实例的库很有帮助。当客户端将共享指针返回时,库需要知道共享指针是来自客户端还是库,如果是来自库,则需要访问在创建实例时存储在删除器中的私有数据。

语法

以下是 C++ Memory::get_deleter 的语法:

D* get_deleter (const shared_ptr<T>& sp) noexcept;

参数

sp − 这是一个共享指针。

示例 1

让我们来看下面的例子,我们将使用 get_deleter 并获取输出。

#include <iostream>
#include <memory>
int main(){
   std::shared_ptr<int> iptr(new int(999), [](int*p) {
      delete(p);
   });
   auto _d = std::get_deleter<void(*)(int*)>(iptr);
   if(_d)
      std::cout<<"0";
   else
      std::cout<<"1";
   return 0;
}

输出

让我们编译并运行上面的程序,这将产生以下结果:

1

示例 2

下面是另一个例子,我们将使用 get_deleter 并获取输出。

#include <iostream>
#include <memory>
struct D {
   void operator()(int* p){
      std::cout << "Welcome To Tutorialspoint\n";
      delete[] p;
   }
};
int main (){
   std::shared_ptr<int> foo (new int[11],D());
   int * bar = new int[20];
   return 0;
}

输出

运行以上代码后,将显示如下输出:

Welcome To Tutorialspoint

示例 3

让我们来看另一个场景,我们将使用 get_deleter 并获取输出。

#include <iostream>
#include <memory>
struct A {
   A(){
      std::cout << "HELLO\n";
   }
};
struct B {
   void operator()(A* p) const{
      std::cout << "WORLD\n";
      delete p;
   }
};
int main(){
   std::unique_ptr<A, B> up(new A(), B());
   B& del = up.get_deleter();
}

输出

代码执行后,将生成如下输出:

HELLO
WORLD
广告