簡體   English   中英

shared_ptr別名構造函數

[英]shared_ptr aliasing constructor

關於以下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;
}

輸出:

1
2
1
get_deleter == 0? false
my_deleter called!

注意我無法使用自由函數my_deleter編譯此示例,對於free get_deleter函數存在一些轉換錯誤(嘗試使用static_castvoid*轉換為函數指針類型)。


別名ctor:[util.smartptr.shared.const] / 13-14

 template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 

13 效果:構造一個shared_ptr實例,用於存儲p並與r 共享所有權

14 后置條件: get() == p && use_count() == r.use_count()

Ctor使用用戶提供的刪除器:[util.smartptr.shared.const] / 9

template shared_ptr(Y * p,D d);

效果:構造擁有對象p和刪除器dshared_ptr對象。

Dtor:[util.smartptr.shared.dest] / 1

〜shared_ptr的();

1 效果:

  • 如果*this或與另一個shared_ptr實例共享所有權( use_count() > 1 ),則沒有副作用。
  • 否則,如果*this 擁有對象p和刪除器d ,則調用d(p)
  • 否則, *this 擁有一個指針p ,並調用delete p

結合這些(讓我們跳過賦值運算符):

  • shared_ptr實例r 擁有對象和刪除器。
  • 別名ctor允許新的shared_ptr實例與r 共享所有權 (即對象和刪除者)。
  • 當調用這個新實例的dtor(或賦值運算符)時,
    • 如果use_count > 1 ,則無效果。
    • 否則,此實例擁有 r指向的對象刪除器(如果有),並將使用此刪除器(如果存在)或delete指向的對象。

是的,因為刪除器存儲在shared_ptr的計數器中('pn'成員boost::detail::shared_count ),並且別名實際上共享計數器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM