首页 > C++ > 正文
智能指针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;
}
猜你喜欢
picture loss