首页 > C++ > 正文 智能指针shared_ptr 浏览 969 · 点赞 0 · 1年前 (2023-10-01) 智能指针shared_ptr.html 在初始化 shared_ptr 智能指针时,还可以自定义所指堆内存的释放规则,这样当堆内存的引用计数为 0 时,会优先调用我们自定义的释放规则。在某些场景中,自定义释放规则是很有必要的。比如,对于申请的动态数组来说,shared_ptr 指针默认的释放规则是不支持释放数组的,只能自定义对应的释放规则,才能正确地释放申请的堆内存。对于申请的动态数组,释放规则可以有两种方式:1、使用 C++11 标准中提供的 default_delete 模板类2、可以自定义释放规则//更多请查看 www.ccc3ccc.com //1、使用default_delete 模板类 //数组不能自动释放,要加上模板函数default_delete shared_ptr<int> pPtr2(new int[3]{2,3,7},default_delete<int[]>()); cout << *(pPtr2.get()+2)<<endl; std::array<int,3> arrTest = {3,6,9}; std::shared_ptr<std::array<int,3>> pPtr1(std::make_shared<std::array<int,3>>(arrTest)); //没找到pPtr1的访问方法,括号内arrTest表示用arrTest元素的值初始化新开辟的数组元素 //2、自定义释放规则 void deleteInt(int*p) { delete []p; } //初始化智能指针,并自定义释放规则 std::shared_ptr<int> p7(new int[10], deleteInt); #include <iostream> #include <memory> using namespace std; const double sgdNum = 99; class Ctest { public: //inline static const double sm_dClass = 34.78; static const double sm_dBoot; static const int sm_iNum = 34; private: /* data */ int m_iAge; // double arrdSubName[int(sm_dClass)]; public: Ctest (/* args */const int iAge = 23); ~Ctest (); void setAge(int iAge){ m_iAge = iAge; } int getAge(){ return m_iAge; } }; Ctest::Ctest(/* args */const int iAge) :m_iAge(iAge) { } Ctest::~Ctest() { } const double Ctest::sm_dBoot = 99.09876; int main(int, char**) { std::cout << "Hello, world!"<<sgdNum<<std::endl; Ctest cTest1; Ctest cTest2(67); std::cout<<cTest1.getAge()<<std::endl; std::cout<<cTest2.getAge()<<std::endl; // std::cout<<Ctest::sm_dClass<<std::endl; // std::cout<<Ctest::sm_dBoot<<std::endl; [[maybe_unused]]int iNuUse = 56; int arri[3]{3,5,7}; std::array<int,3> arrTest = {3,6,9}; std::shared_ptr<std::array<int,3>> pPtr1(std::make_shared<std::array<int,3>>(arrTest)); // 没找到pPtr1的访问方法,括号内arrTest表示用arrTest元素的值初始化新开辟的数组元素 arrTest[2] = 25; arrTest.at(1) = 15; cout << arrTest.at(0)<<"---"<<arrTest.at(1)<<"---"<<arrTest.at(2)<<endl; //数组不能自动释放,要加上模板函数default_delete shared_ptr<int> pPtr2(new int[3]{2,3,7},default_delete<int[]>()); cout << *(pPtr2.get()+2)<<endl; } C++ 已有0人点赞 打赏一下作者 上一篇 Effective C++ 下一篇 Lambda表达式 猜你喜欢 含指针的类 普通类 类使用空间说明