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

https://blog.csdn.net/nou_camp/article/details/70195795

在上一篇博客中(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

这里写图片描述

这就是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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

仿函数:仿函数(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

定制删除器和空间分配器

#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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

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


猜你喜欢

转载自blog.csdn.net/sinat_35297665/article/details/80068089