zoukankan      html  css  js  c++  java
  • 关于内存回收+为什么使用智能指针

    毕业以来也换了几份工作了,大部分在搞C++,做过上位机【MFC、QT、C#..】,做过纯C++后台【企业存储】。在某HW公司做纯C++时,真正摆脱了界面开发。以前没接触过的C++11也有所了解,不至于老牛啃南瓜无从下口。

    在做过好几个MFC和QT的项目后,一直想接触C++的东西,可是没机会,就在网上找,智能指针、设计模式、数据结构。。可是这些东西很难应用到项目中,强行加入完全就是冗余毫无用处。

    直到最近拿到一个demo做二次开发,demo是别人写了个模板在那里,我需要的是读懂代码,增加功能。

    项目主要功能:一个MFC工程,操作一个线性相机,相机提供dll和api,将相机采集的图像数据全部存入内存堆中,然后根据设置长宽把图片剪切成一张张jpg存到磁盘。用一个线程采集总的图片数据,把总的图片数据切成一张张数据,然后多个线程来一张张数据落盘。

    这个项目让我印象深刻的是

    1、内存的回收:

    struct* a = new A;

     byte* b = new byte[n];

    a->data = b;

    delete a;

    delete []b;

    ps:数据的new是在1线程,但是释放在2线程。new就是在堆上分配一段空间,如果没有释放,这段空间会被一直占用,时间久了就没有可用的空间了,delete就是告诉系统,这段空间可以被后面的代码使用了。new和delete可以在不同的函数、线程,它们对象是同一片地址空间,但是在一个流程里一定要去释放。我感觉这可能就是C++或者C这种带指针的语言的弊端,如果在同一函数中new和delete成对出现,我们可能很好维护,看代码的人也好懂,但是往往很多项目需要上面那个那样,使用多个线程去同时工作提高效率,所以往往找不到对应的new或者delete。

    2、智能指针

    我看了某HW的大佬们写的代码,几乎没用到裸露的指针,全是智能指针包裹的。直到现在我也不能很深刻的明白到底有啥用。结合上面的工程,好像能想明白:

    假设堆上面有片图片数据空间,有两个地方都要去释放它,a释放完之后,这篇空间已经被标记为已释放,此时如果b还想去释放,肯定会出错。而智能指针就是告诉系统,如果还有栈上面的指针指向这个堆空间,a释放的时候就不释放,这样b或者其他对象就能访问这个空间。【仅仅是猜测,感觉用处没想象中大】

  • 相关阅读:
    HTML中所用的标签(二)
    HTML中所用的标签(一)
    学习笔记之04表格嵌套练习1
    学习笔记之03百度搜索页面
    学习笔记之02简单的基础
    学习笔记之01程序员起航篇
    Part 53 to 55 Talking about Reflection in C#
    Part 48 to 51 Talking about Access Modifiers in C#
    Part 59 to 60 Difference between Convert ToString and ToString,String and StringBuilder
    Part 57 to 58 Why should you override ToString and Equal Method
  • 原文地址:https://www.cnblogs.com/judes/p/10768361.html
Copyright © 2011-2022 走看看