日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[C++11]共享智能指针shared_ptr指定删除器

發布時間:2023/12/4 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C++11]共享智能指针shared_ptr指定删除器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當智能指針管理的內存對應的引用計數變為 0 的時候,這塊內存就會被智能指針析構掉了。另外,我們在初始化智能指針的時候也可以自己指定刪除動作,這個刪除操作對應的函數被稱之為刪除器,這個刪除器函數本質是一個回調函數,我們只需要進行實現,其調用是由智能指針完成的。

代碼如下:

#include <iostream> #include <memory> #include <string> using namespace std;class Test { public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num; };int main() {shared_ptr<Test> ppp(new Test(100), [](Test *t){//釋放內存的操作cout << "---------------------" << endl;delete t;});return 0;}

測試結果:

如果我們通過智能指針管理一塊數組內存的時候,它自帶的刪除器是刪除不掉的,這個時候我們就必須自己提供一個刪除器。

代碼如下:

#include <iostream> #include <memory> #include <string> using namespace std;class Test { public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num; };int main() {shared_ptr<Test> p1 (new Test[5]);return 0;}

測試結果:

代碼如下:

#include <iostream> #include <memory> #include <string> using namespace std;class Test { public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num; };int main() {//shared_ptr<Test> p1 (new Test[5]);shared_ptr<Test> p1(new Test[5], [](Test * t) {delete[] t;});return 0;}

測試結果:

在刪除數組內存時,除了自己編寫刪除器,也可以使用 C++ 提供的 std::default_delete() 函數作為刪除器,這個函數內部的刪除功能也是通過調用 delete 來實現的,要釋放什么類型的內存就將模板類型 T 指定為什么類型即可。具體處理代碼如下:

代碼如下:

int main() {//shared_ptr<Test> p1 (new Test[5]);//shared_ptr<Test> p1(new Test[5], [](Test * t) {// delete[] t;//});shared_ptr<Test> p2(new Test[5], default_delete<Test[]>());return 0;}

測試結果:

另外,我們還可以自己封裝一個 make_shared_array 方法來讓 shared_ptr 支持數組,代碼如下:

#include <iostream> #include <memory> using namespace std;template <typename T> shared_ptr<T> make_share_array(size_t size) {// 返回匿名對象return shared_ptr<T>(new T[size], default_delete<T[]>()); }int main() {shared_ptr<int> ptr1 = make_share_array<int>(10);cout << ptr1.use_count() << endl;shared_ptr<char> ptr2 = make_share_array<char>(128);cout << ptr2.use_count() << endl;return 0; }/*作者: 蘇丙榅 鏈接: https://subingwen.cn/cpp/shared_ptr/#2-%E6%8C%87%E5%AE%9A%E5%88%A0%E9%99%A4%E5%99%A8 來源: 愛編程的大丙 */

不過在C++以后,shared_ptr支持了可以管理數組類型的地址了。

代碼如下:

int main() {shared_ptr<Test[]> ptr4(new Test[3]);return 0;}

測試結果:

總結

以上是生活随笔為你收集整理的[C++11]共享智能指针shared_ptr指定删除器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。