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
廣告