[英]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_cast
從void*
轉換為函數指針類型)。
別名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
和刪除器d
的shared_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
擁有對象和刪除器。 shared_ptr
實例與r
共享所有權 (即對象和刪除者)。 use_count > 1
,則無效果。 r
指向的對象和刪除器(如果有),並將使用此刪除器(如果存在)或delete
指向的對象。 是的,因為刪除器存儲在shared_ptr的計數器中('pn'成員boost::detail::shared_count
),並且別名實際上共享計數器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.