template <typename T, typename PARENT = empty, typename DELETER = DefaultDeleter<T> >
时间: 2024-05-20 10:11:00 浏览: 177
这是一个 C++ 的模板类定义,其中包含了三个模板参数:
- T:表示该模板类所管理的对象的类型;
- PARENT:表示该模板类所继承的父类类型,默认值为 empty,即无父类;
- DELETER:表示该模板类所使用的对象销毁器类型,默认为 DefaultDeleter<T>,即使用默认的 delete 运算符进行对象销毁。
该模板类主要用于封装对某种类型的对象的管理,包括对象的创建、销毁和访问等操作。其中,PARENT 参数用于指定该模板类所继承的父类,可以通过继承实现对父类方法的重载或扩展。DELETER 参数用于指定该模板类所使用的对象销毁器类型,可以通过指定不同的销毁器实现对对象销毁方式的定制。
相关问题
get_deleter实现原理
`std::shared_ptr` 类型中的 `get_deleter()` 成员函数可以用于获取与当前 `shared_ptr` 对象关联的删除器。其实现原理如下:
在 `std::shared_ptr` 内部,与当前对象关联的删除器是以一个指向删除器的指针的形式保存的。因此,`get_deleter()` 函数的实现很简单,只需要返回这个指针即可。具体实现如下:
```cpp
template<typename T, typename Deleter>
Deleter* shared_ptr<T, Deleter>::get_deleter() const noexcept {
return &deleter_;
}
```
其中,`deleter_` 是一个成员变量,表示与当前 `shared_ptr` 对象关联的删除器。因此,`return &deleter_;` 语句返回的是一个指向 `deleter_` 的指针,即当前 `shared_ptr` 对象关联的删除器的指针。
需要注意的是,只有在创建 `shared_ptr` 对象时显式指定了删除器,才能使用 `get_deleter()` 函数获取与当前对象关联的删除器。否则将会导致未定义行为。
Member 'make_shared' cannot have template
引用\[1\]:std::shared_ptr<int> p1 = std::make_shared<int>(5);std::weak_ptr<int> wp1 {p1}; // p1 owns the memory. \[1\]
引用\[2\]:You break this by usingweak_ptr. The "owner" typically useshared_ptrand the "owned" use aweak_ptrto its parent, and convert ittemporarilytoshared_ptrwhen it needs access to its parent.(也就是上面说的弱引用使用方法) Smart pointer 使用方法 \[2\]
引用\[3\]: (1)指向对象的指针,_M_ptr (2)用于控制引用计数的对象,_M_refcount。 4、reset void reset() noexcept { __shared_ptr().swap(*this); } template<typename _Tp1> void reset(_Tp1* __p) // _Tp1 must be complete. { // Catch self-reset errors. _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr); __shared_ptr(__p).swap(*this); } template<typename _Tp1, typename _Deleter> void reset(_Tp1* __p, _Deleter __d) { __shared_ptr(__p, __d).swap(*this); } template<typename _Tp1, typename _Deleter, typename _Alloc> void reset(_Tp1* __p, _Deleter __d, _Alloc __a) { __shared_ptr(__p, __d, std::move(__a)).swap(*this); } \[3\]
问题:Member 'make_shared' cannot have template
回答: 错误信息"Member 'make_shared' cannot have template"意味着在使用make_shared函数时出现了错误。make_shared是一个模板函数,用于创建一个shared_ptr对象并初始化它所指向的对象。通常情况下,我们可以使用make_shared来创建一个shared_ptr对象,而不需要显式地指定模板参数。例如,std::shared_ptr<int> p1 = std::make_shared<int>(5);可以创建一个指向整数的shared_ptr对象p1,并将其初始化为5。\[1\]然而,如果在使用make_shared时出现了该错误,可能是因为编译器无法正确地推断模板参数。在这种情况下,您可以尝试显式地指定模板参数,例如std::shared_ptr<int> p1 = std::make_shared<int>(5);。\[1\]
#### 引用[.reference_title]
- *1* *2* [C++ smart pointer](https://blog.csdn.net/u011279649/article/details/121473669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [GNU C++ 智能指针21- 解析__shared_ptr类9](https://blog.csdn.net/kupe87826/article/details/120512250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文