std::get_deleter
來自 cppreference.com
< cpp | 記憶體 | shared ptr
定義於標頭檔案 <memory> |
||
template< class Deleter, class T > Deleter* get_deleter( const std::shared_ptr<T>& p ) noexcept; |
(C++11 起) | |
訪問 p 的刪除器。如果共享指標 p 擁有一個 cv 非限定 `Deleter` 型別的刪除器(例如,如果它是用一個將刪除器作為引數的建構函式建立的),則返回一個指向該刪除器的指標。否則,返回空指標。
目錄 |
[編輯] 引數
p | - | 一個需要訪問其刪除器的共享指標。 |
[編輯] 返回值
一個指向所擁有的刪除器的指標,或 nullptr。返回的指標至少在仍然存在至少一個擁有它的 shared_ptr 例項時有效。
[編輯] 注意
如果例如 std::weak_ptr 仍然存在,並且實現直到整個控制塊被銷燬才銷燬刪除器,則返回的指標可能比最後一個 shared_ptr 例項壽命更長。
[編輯] 示例
演示 std::shared_ptr 的刪除器獨立於 shared_ptr 的型別。
執行此程式碼
#include <iostream> #include <memory> struct Foo { int i; }; void foo_deleter(Foo* p) { std::cout << "foo_deleter called!\n"; delete p; } int main() { std::shared_ptr<int> aptr; { // create a shared_ptr that owns a Foo and a deleter auto foo_p = new Foo; std::shared_ptr<Foo> r(foo_p, foo_deleter); aptr = std::shared_ptr<int>(r, &r->i); // aliasing ctor // aptr is now pointing to an int, but managing the whole Foo } // r gets destroyed (deleter not called) // obtain pointer to the deleter: if (auto del_p = std::get_deleter<void(*)(Foo*)>(aptr)) { std::cout << "shared_ptr<int> owns a deleter\n"; if (*del_p == foo_deleter) std::cout << "...and it equals &foo_deleter\n"; } else std::cout << "The deleter of shared_ptr<int> is null!\n"; } // deleter called here
輸出
shared_ptr<int> owns a deleter ...and it equals &foo_deleter foo_deleter called!
[編輯] 另請參閱
std::shared_ptr 建構函式 (公開成員函式) | |
返回用於銷燬託管物件的刪除器 ( std::unique_ptr<T,Deleter> 的公共成員函式) |