iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11中的智能指针和垃圾回收使用
  • 785
分享到

C++11中的智能指针和垃圾回收使用

C++11智能指针和垃圾回收C++11智能指针C++11垃圾回收 2023-02-02 12:02:06 785人浏览 薄情痞子
摘要

在C/C++中,我们需要自己管理动态内存区,我们在写代码中可能会出现如下3中内存管理的缺陷 野指针:内存单元已经释放,但是指向它的指针还在使用重复释放:试图是释放已经释放过的内存单元

C/C++中,我们需要自己管理动态内存区,我们在写代码中可能会出现如下3中内存管理的缺陷

  • 野指针:内存单元已经释放,但是指向它的指针还在使用
  • 重复释放:试图是释放已经释放过的内存单元
  • 内存泄漏:不再使用的内存单元没有进行释放

c++恶心的地方就在于它存在指针,需要编写者自己管理内存,所以内存上面的问题就会有很多,但是在其他语言,例如python,java,C#,他都不存在指针概念,也就意味著你不需要开辟释放内存这些操作。而正因为C++将指针暴露出来,甚至将右值引用暴露出来,才使得C++的运行效率非常快。

为了减少C++中的内存问题,就出现了智能指针,它是一种对C风格指针的优化,它把内存的释放放在了智能指针的析构函数中,这样子就能减少一部分自己手动释放内存的代码。

1.C++11中的unique_ptr

#include<memory>
#include<iOStream>
using namespace std;
int main()
{
    unique_ptr<int> up1(new int(11));
    unique_ptr<int> up2=up1;//无法通过编译

    cout<<*up1<<endl;//11
    unique_ptr<int> up3=move(up1);//现在up3是数据的唯一指针

    cout<<*up3<<endl;//11
    cout<<*up1<<endl;//运行错误

    up3.reset();//释放内存
    up1.reset();//不会重复释放内存

    cout<<*up3<<endl;//运行错误
}

我们知道unique_ptr正如它的名字一样,它表示一个对象只能由一个指针绑定,不允许一个对象同时又多个unique_ptr绑定。

而且 unique_ptr只存在移动语义,而不存在拷贝语义 ,我们看上面代码中unique_ptr<int> up3=move(up1);,在unique_ptr中只存在移动构造函数和移动赋值函数,不存在拷贝构造函数和拷贝赋值函数。所以说我们只能用右值来构造或赋值unique_ptr。

还有一种初始化unique_ptr的方法就是:make_unique<>(),相较于使用new初始化,前者内存碎片化更少,在现代C++种主要使用,make_unique。

实际上,C++98中的auto_ptr和C++11中的unique_ptr实现的是同一个东西,但是在C++98中我们不存在移动语义,所以auto_ptr它是存在拷贝构造函数和拷贝赋值函数的,所以诸如:
auto_ptr<int> up2=up1;是可以通过编译的,在C++11中我们废弃掉了,auto_ptr也是这个原因。

2.C++11中的shared_ptr和weak_ptr

shared_ptr是一种共享式的指针,它采用引用计数的方式,来决定何时释放内存,引用计数就是说,它统计每个对象有几个指针指向它。一旦一个对象的引用计数为0,即不存在指向它的指针,那么就释放它。
weak_ptr是用来验证shared_ptr指向的内存单元的有效性的,被它指向的对象的引用计数不会增加。

#include<memory>
#include<iostream>
using namespace std;

void Check(weak_ptr<int>& wp)
{
    shared_ptr<int> sp=wp.lock();
    if(sp!=nullptr)
        cout<<"still "<<*sp<<endl;
    else
        cout<<"pointer is invalid."<<endl;
}
int main()
{
    shared_ptr<int> sp1=make_shared<int>(22);
    shared_ptr<int> sp2=sp1;
    weak_ptr<int> wp=sp1;

    cout<<*sp1<<endl;
    cout<<*sp2<<endl;
    Check(wp);

    sp1.reset();
    cout<<*sp2<<endl;
    Check(wp);

    sp2.reset();
    Check(wp);

}

22
22
still 22
22
still 22
pointer is invalid.

3.垃圾回收

虽然智能指针能够帮助用户有效管理堆内存,但是它还是需要显式声明智能指针,而完全不需要指针的内存管理方法也会更讨人喜欢。这种方法就是垃圾回收机制,写代码的时候不需要开辟释放内存操作,这些操作都由编译器自动实现,这种智能化的方案就是垃圾回收机制。

遗憾的是,C++不支持垃圾回收机制。

垃圾回收的方式有4种

基于引用计数的方法
其实就是和shared_ptr一样的方式,就是一旦对象的引用次数为0就释放它,Python就是使用的这种方案,不过这种方案不好,它效率比较低,一旦对象创建,或者有指针指向它,都要计算引用此时,而且它不能解决"环形引用"问题

标记-清除
这种方法就是存在一个根对象,它管理所有对象,依次遍历每个对象,给它们引用的区域打上标记,然后遍历完成后,把所有没有标记的区域释放掉,这种方案的缺陷在于会存在大量的内存碎片

标记-整理
它是在标记-清除方案的基础上,标记完后不再遍历释放垃圾了,而是所有被标记的区域,向左靠齐,这样就减少了内存碎片

标记-拷贝
它是将内存空间分为两块:From和to,刚开始就从From空间种分配内存,一旦From内存满了,就把From空间中所有活对象,拷贝到to空间中,而且都是向左靠齐的,然后再将From和to的角色互换。

很遗憾C++11目前还没有公开支持过垃圾回收,不过有些库和有限编译器支持了部分垃圾回收的功能

int main()
{
    int *p=new int;
    p+=10;
    p-=10;
    *p=10;
}

上面代码中,一旦p指向了其他区域,如果你的编译器支持垃圾回收,例如采用的引用计时方式,那么一旦p移到了其他地区,这个开辟的new int空间,就会被释放,更危险的是,这块空间会被其他线程使用,这时候,p如果又指回了原来的地方,那么p就是一个野指针。

为了防止,new int这块空间被垃圾回收器回收掉,我们的一种方案是:

int main()
{
    int *p=new int;
    declare_reachable(p);
    p+=10;
    p-=10;
    *p=10;
}

这里的declare_reachable函数显式的告诉垃圾回收器,你不要取释放这块空间

到此这篇关于C++11中的智能指针和垃圾回收使用的文章就介绍到这了,更多相关C++11 智能指针和垃圾回收内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++11中的智能指针和垃圾回收使用

本文链接: https://www.lsjlt.com/news/193942.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++11中的智能指针和垃圾回收使用
    在C/C++中,我们需要自己管理动态内存区,我们在写代码中可能会出现如下3中内存管理的缺陷 野指针:内存单元已经释放,但是指向它的指针还在使用重复释放:试图是释放已经释放过的内存单元...
    99+
    2023-02-02
    C++11 智能指针和垃圾回收 C++11 智能指针 C++11 垃圾回收
  • C++11 智能指针的具体使用
    目录智能指针的原理RAII智能指针的原理auto_ptr1.auto_ptr的使用及问题unique_ptrshared_ptrshared_ptr的循环引用智能指针的原理 RAII...
    99+
    2024-04-02
  • C++11中的智能指针怎么用
    本篇内容介绍了“C++11中的智能指针怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!函数原型:shared_ptr& oper...
    99+
    2023-06-19
  • C++11智能指针shared_ptr怎么使用
    本篇内容介绍了“C++11智能指针shared_ptr怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!shared_prt的本身是一个...
    99+
    2023-06-19
  • C++11智能指针weak_ptr怎么使用
    本篇内容主要讲解“C++11智能指针weak_ptr怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11智能指针weak_ptr怎么使用”吧!弱指针weak_ptr看起来更像shar...
    99+
    2023-06-19
  • C++11智能指针unique_ptr有什么作用
    这篇文章主要讲解了“C++11智能指针unique_ptr有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11智能指针unique_ptr有什么作用”吧!软件开发中有很多处理是...
    99+
    2023-06-19
  • C++11智能指针unique_ptr用法使用场景分析
    一、概述 C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr...
    99+
    2024-04-02
  • c++智能指针unique_ptr的使用
    目录1.为什么需要unique_ptr2.什么是unique_ptr3.unique_ptr特性4.如何使用unique_ptr4.1简单使用4.2指向数组5.unique_ptr需...
    99+
    2024-04-02
  • C++11中的智能指针shared_ptr、weak_ptr源码解析
    目录1、前言2、源码准备3、智能指针概念4、源码解析4.1、shared_ptr解析4.1.1、shared_ptr4.1.2、__shared_ptr4.1.3、__shared_...
    99+
    2024-04-02
  • C++中怎么使用智能指针
    这篇文章给大家介绍C++中怎么使用智能指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、为什么要使用智能指针一句话带过:智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而...
    99+
    2023-06-20
  • C++中如何使用智能指针
    这期内容当中小编将会给大家带来有关C++中如何使用智能指针,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内存泄露是C++程序员都头疼的大问题。C++缺乏像JAVA、C#一样,拥有GC这么一项有利的武器,它...
    99+
    2023-06-17
  • PHP中垃圾回收相关函数的使用
    目录再谈循环引用以及强制清理循环引用开启、关闭及查看循环引用垃圾回收状态强制回收Zend引擎内存管理器使用的内存获取垃圾收集器的信息测试代码:相关文章之前我们已经学习过 PHP 中的...
    99+
    2024-04-02
  • C++ 内存管理中的自动垃圾回收
    c++++ 中自动垃圾回收需要使用第三方工具或库。可以使用智能指针或垃圾回收器库。智能指针自动释放底层对象,而垃圾回收器库使用算法跟踪不再使用的数据结构。案例:使用智能指针 std::s...
    99+
    2024-05-04
    c++ 垃圾回收 垃圾回收器 标准库
  • C++中智能指针最常用的shared_ptr和unique_ptr
    目录shared_ptr使用shared_ptr注意unique_ptrshared_ptr 基本用法: 可以通过构造函数, make_shared<T>辅助函数和res...
    99+
    2024-04-02
  • HDFS垃圾回收箱的配置及使用
    本篇内容介绍了“HDFS垃圾回收箱的配置及使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!HDFS为每个用户创建一个回收站:目录:/use...
    99+
    2023-06-03
  • C++中Boost的智能指针scoped_ptr怎么使用
    本篇内容主要讲解“C++中Boost的智能指针scoped_ptr怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中Boost的智能指针scoped_ptr怎么使用”吧!boost:...
    99+
    2023-07-02
  • C++中Boost的智能指针weak_ptr
    循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下: #include <string> #includ...
    99+
    2024-04-02
  • C++中Boost的智能指针scoped_ptr
    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #includ...
    99+
    2024-04-02
  • C/C++中智能指针的用法详解
    目录前言一、什么是智能指针二、使用方法1.shared_ptr2.unique_ptr3.weak_ptr前言 本章主要介绍一些C/C++中智能指针的实现原理以及如何使用 一、什么是...
    99+
    2023-01-04
    C++智能指针使用 C++智能指针
  • C++智能指针shared_ptr怎么使用
    本篇内容介绍了“C++智能指针shared_ptr怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是shared_ptr?C+...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作