C++智能指针(三)总结

在上一篇博客中(C++智能指针(二))模拟实现了三种智能指针。
其中最好的就是shared_ptr,但是这并不代表它就是最完美的,它也有问题,这个问题就是循环引用问题。下面用一段代码来解释说明循环引用问题。

#include<memory>
struct  ListNode
{
    shared_ptr<ListNode> _next;
    shared_ptr<ListNode> _prev;
    int _data;
    ListNode(int x)
        :_data(x)
        , _next(NULL)
        , _prev(NULL)
    {}
    ~ListNode()
    {
        cout << "~ListNode()" << endl;
    }
};

void test()
{
    shared_ptr<ListNode> ap1(new ListNode(10));
    shared_ptr<ListNode> ap2(new ListNode(20));
    ap1->_next = ap2;
    ap2->_prev = ap1;
}
int main()
{
    test();
    system("pause");
    return 0;
}

这里写图片描述

这就是shared_ptr的缺陷–循环引用问题
这里写图片描述

为了解决循环引用的问题,引进了弱指针weak_ptr
weak_ ptr是一种不控制所指向对象的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr 不会改变shared_ptr的引用计数
测试代码如下

#include<iostream>
using namespace std;
#include<memory>
struct  ListNode
{
    weak_ptr<ListNode> _next;
    weak_ptr<ListNode> _prev;
    int _data;
    ListNode(int x)
        :_data(x)
    {}
    ~ListNode()
    {
        cout << "~ListNode()" << endl;
    }
};

void test()
{
    shared_ptr<ListNode> ap1(new ListNode(10));
    shared_ptr<ListNode> ap2(new ListNode(20));
    ap1->_next = ap2;
    ap2->_prev = ap1;
}
int main()
{
    test();
    system("pause");
    return 0;
}

仿函数:仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

template<class T>
struct Less
{
    bool operator()(const T& l, const T& r)
    {
        return l < r;
    }
};
void Test2()
{
    Less<int>less1;
    cout << less1(1, 2) << endl;
}
int main()
{
    Test2();
    system("pause");
    return 0;
}

定制删除器和空间分配器

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<memory>
class FClose
{
public:
    void operator()(void* ptr)
    {
        cout << "fclose" << endl;
        fclose((FILE*)ptr);
    }
};
class Free
{
public:
    void operator()(void* ptr)
    {
        cout << "free" << endl;
        free(ptr);
    }
};

void test() 
{
    //定制删除器
    shared_ptr<FILE>p1(fopen("test.txt", "w"), FClose());
    //定制删除器和分配器
    shared_ptr<int> p2((int*)malloc(sizeof(int)), Free(), allocator<int>());
}
int main()
{
    test();
    system("pause");
    return 0;
}

智能指针总结
智能指针可以提供对动态分配的内存安全而方便的管理,但这建立在正确的使用前提下。
1.不使用相同的内置指针值初始化(或reset)多个智能指针。
2.不delete get( )返回的指针。(p.get( )返回p中保存的指针。要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了)
3.不使用get()初始化或reset另一个智能指针。
4.如果使用get( )返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变成无效了。
5.使用智能指针管理的资源不是new分配的内存,记住传递给他一个定制的删除器。  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值