C++智能指针

C#、Java、python和go等语言中都有垃圾自动回收机制,在对象失去引用的时候自动回收,而且基本上没有指针的概念,而C++语言不一样,C++充分信任程序员,让程序员自己去分配和管理堆内存,如果管理的不好,就会很容易的发生内存泄漏问题,而C++11增加了智能指针(Smart Pointer)。主要分为shared_ptr、unique_ptr和weak_ptr三种,使用时需要引用头文件。c++98中还有auto_ptr,基本被淘汰了,不推荐使用。而c++11中shared_ptr和weak_ptr都是参考的boost库中实现的。

c&c++指针构建和释放

c语言中最常使用的是**malloc()**函数分配内存,free()函数释放内存,而c++中对应的是newdelete关键字。malloc()只是分配了内存,而new则更进一步,不仅分配了内存,还调用了构造函数进行初始化。使用示例:

int main()
{
    // malloc返回值是 void*
    int* argC = (int*)malloc(sizeof(int));
    free(argC);

    char*c = (char*)malloc(100);
    free(c);

    char *age = new int(25); //做了两件事情 1.分配内存 2.初始化
    int* height = new int(160);

    delete height;
    delete age;
    
    char* arr = new int[100];
    delete[] arr;
    /*delete数组需要使用delete[],事实上,c++原始支持的数据结构组成的
    数组不需要[]也可以,但 自定义的数据类型组成的数组必须使用delete[]*/
}

newdelete必须成对出现,有时候是不小心忘记了delete,有时候则是很难判断在这个地方自己是不是该delete,这个和资源的生命周期有关。一旦忘记释放指针内存,则导致内存泄露。

智能指针的使用

简单地说,智能指针是用对象去管理一个资源指针,同时用一个计数器计算引用当前指针对象的个数,在其内部的析构函数中,会主动delete指针指向的内存空间。主要分为shared_ptr、unique_ptr和weak_ptr三种。这里只介绍std::shared_ptr,实际当中这类较为常用。

std::shared_ptr

std::shared_ptr包装了new操作符动态分配的内存,可以自由拷贝复制,基本上是使用最多的一个智能指针类型。可由多个对象共同管理内存空间,当管理指针的对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁时,计数器为1,此时在销毁指针管理对象的同时,也对指针管理对象所管理的指针进行delete操作。

#include <memory>
#include <iostream>
class Test
{
public:
    Test()
    {
        std::cout << "Test()" << std::endl;
    }
    ~Test()
    {
        std::cout << "~Test()" << std::endl;
    }
};
int main()
{
    std::shared_ptr<Test> p1 = std::make_shared<Test>();
    std::cout << "1 ref:" << p1.use_count() << std::endl;
    {
        std::shared_ptr<Test> p2 = p1;
        std::cout << "2 ref:" << p1.use_count() << std::endl;
    }
    std::cout << "3 ref:" << p1.use_count() << std::endl;
    return 0;
}

针对代码解读如下: + std::make_shared里面调用了new操作符分配内存; + 第二个p1.use_count()之所以显示为2,是因为增加了引用对象p2,而随着大括号的结束,p2的作用域结束,所以p1的引用计数变回1,而随着main函数的结束,p1的作用域结束,此时检测到计数为1,那就会在销毁p1的同时,调用p1的析构函数delete掉之前分配的内存空间;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值