C++ Memory::owner_less



此函数并非基于值的类型排序,而是为`std::weak_ptr`和`std::shared_ptr`提供了基于所有者的混合类型排序。由于放置顺序的原因,只有当这两个智能指针都共享所有权时,它们才被视为等价。或者,即使从原始指针的getter方法获取的值不同,但如果它们都是空的,则也被视为等价。

这些比较基于所有者对弱指针和共享指针进行比较。“owner_less”对控制块的地址进行排序。在这种情况下,如果两个共享或弱指针具有相同的所有权,则它们被视为等价。

语法

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

struct owner_less;
struct owner_less<shared_ptr<T>>;
struct owner_less<weak_ptr<T>>;

参数

  • Ptr - 它是一个托管指针。
  • T - 它表示托管指针类型所指向的对象的类型。

示例1

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

#include <iostream>
#include <memory>
#include <set>
struct X {};
int main(){
   X* Y = new X();
   std::shared_ptr<X> A(Y);
   std::shared_ptr<X> B(Y);
   std::set<std::shared_ptr<X>> set1;
   set1.insert(A);
   std::cout << set1.size() << std::endl;
   set1.insert(B);
   std::cout << set1.size() << std::endl;
   std::set<std::shared_ptr<X>, std::owner_less<std::shared_ptr<X>>> set2;
   set2.insert(A);
   std::cout << set2.size() << std::endl;
   set2.insert(B);
   std::cout << set2.size() << std::endl;
}

输出

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

1
1
1
2
free(): double free detected in tcache 2
Aborted (core dumped)

示例2

以下为另一个示例,我们将使用owner_less并获取输出。

#include <iostream>
#include <memory>
#include <set>
int main (){
   int * p = new int (10);
   std::shared_ptr<int> a (new int (20));
   std::shared_ptr<int> b (a,p);
   std::set < std::shared_ptr<int> > value_based;
   std::set < std::shared_ptr<int>, std::owner_less<std::shared_ptr<int>> > owner_based;
   value_based.insert (a);
   value_based.insert (b);
   owner_based.insert (a);
   owner_based.insert (b);
   std::cout << "value_based.size() is " << value_based.size() << '\n';
   std::cout << "owner_based.size() is " << owner_based.size() << '\n';
   delete p;
   return 0;
}

输出

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

value_based.size() is 2
owner_based.size() is 1
广告