前言:众所周知如果一个资源一旦读入就不需要修改,且多个线程都加载读取访问这个资源,那咱们就可以将这个资源声明为static类型,多线共享,既节省内存资源,也可以加快多线初始化这个资源的时间(一旦有一个线程对资源进行了加载,其他线程可以跳过加载资源的环节)

问题:简答描述下吧:  我的测试程序里, new了这样类的对象的指针,并加载了资源,进行了一系列的操作后,我delete掉这个指针,然后又去做别的操作,但是发现delete的操作并没有释放掉这个类对象加载的资源内存,导致了即使后面我的程序不用这个类了,但是内存还占着。

分析: 我们都知道C/C++中静态成员变量的内存的存放在全局内存的静态区域,即使是类内静态成员,也是放在全局内存中的。因此,我们虽然delete掉了这个类,但是并不代表我们真的释放掉了类内静态成员的内存,这些静态成员的内存会在整个进程退出的时候由系统回收,因此如果我们没有去显式的释放这些静态内存,而且没有像我问题中发现的那样,我们的程序貌似也跑的挺好。

但是这确实是一个问题。

解决方案:

这个时候有人说了,直接将静态改为非静态就好了,是的,改为非静态,内存回收的问题立即解决,都不用改调用程序。但是这种情况下,每个对象都会有个资源的副本,这就从另外一个角度浪费了内存(哈哈,拣了芝麻丢了西瓜),所以这种方案舍弃。

我试了两个其他解决方案:

本来我的类内的静态成员声明是这样的:

class A

{

private:

static  class B b;

}

方案1: 在A的析构里显式的调用B的析构函数,释放内存

A::~A()

{

b.~B();

}

方案2:将成员变量声明为指针,然后在A的构造里new,在A的析构里delete即可。

有错误的地方还希望指出,谢谢。

C++类内静态成员的内存释放问题相关推荐

  1. 【学习笔记】类对象的内存释放

    类对象的内存释放 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 类对象与其他数据变量一样,都是要占据程序内存的,如果确定后续程序不会再使用对象实例,我们就可以删除对 ...

  2. 备用内存 释放_如何释放为硬件保留的内存(内详!!!)

    -------------------------------------分割线------------------------------------ ----------------------- ...

  3. java类和对象在内存的表现形式

    Java内存分配与管理是Java的核心技术之一,不管学习任何一门语言,我们要知其然,知其所以然,本文主要分析下Java中类和对象在内存中的表现形式,方便我们对其有更深了解.一般Java在内存分配时会涉 ...

  4. 类的静态成员函数和静态数据成员

    一.静态数据成员 1.定义: 静态数据成员就是给类的普通数据成员加上关键字static. 2.访问规则 静态数据成员也遵守public/protected/private访问规则 访问静态成员时,则可 ...

  5. 深拷贝与浅拷贝~动态内存释放有关

    浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如: class A{ public: A(int ...

  6. 《C Primer Plus》读书笔记——存储类、链接和内存管理

    背景 距离上次写读书笔记的日子已有半个月了.这段时间一直在做摄像头直立平衡车,也把<C Primer Plus>的中级部分扫了一遍.现在做赛道算法识别遇到瓶颈了,就想把读书笔记补回来.原计 ...

  7. 初始化列表||类对象作为类成员|| 静态成员

    初始化列表 作用: C++提供了初始化列表语法,用来初始化属性 语法:构造函数():属性1(值1),属性2(值2)... {} #include <iostream> using name ...

  8. static方法不能直接访问类内的非static变量和不能调用this,super语句分析

    大家都知道在static方法中,不能访问类内非static成员变量和方法.可是原因是什么呢? 这首先要从static方法的特性说起.static方法,即类的静态成员经常被称为"成员变量&qu ...

  9. 【C++面向对象】类的静态成员函数(static member functions)

    一.静态成员函数的引入 在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用.而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象.类对象提供this指针给这种函数使 ...

  10. c语言类静态数据成员函数,鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员)...

    鸡啄米在上一讲数据和函数中讲到,函数之间共享数据也就是此函数访问彼函数的数据主要是通过局部变量.全局变量.类的数据成员.类的静态成员及友元实现的,前三个已经讲过了,这一讲鸡啄米来讲讲静态成员.静态成员 ...

最新文章

  1. 教你辨别36k纯数据科学家
  2. 转 mvc项目中,解决引用jquery文件后智能提示失效的办法
  3. POJ 图算法(3)
  4. Centos 7 下安装PHP7.2(与Apache搭配的安装方式)
  5. 【世界上最美丽的7张太阳照片】
  6. 沈阳职业计算机学院宿舍几人间,沈阳工学院宿舍怎么样 住宿条件好不好
  7. Qt GUI@学习日志
  8. jQuery和react实现二维码
  9. 浅谈Get和Post方法的区别与TCP与UDP区别
  10. VB程序设计算机,VB编程:编写一个过程,用来计算并输出 S=1+1/2+1/3+……+1/100 的值。...
  11. 【深度学习】PyCorrector中文文本纠错实战
  12. Siamese Network(孪生网络)
  13. python怎么做成app_自己怎么做App软件 自己制作APP教程
  14. makefile中的隐含规则
  15. 搜索引擎的博客提交入口
  16. 蚂蚁金服自研架构 SOFA 背后的工程师|1024快乐
  17. 迪士尼无限3.0连接服务器,迪士尼无限3period;0BUG问题解决 | 手游网游页游攻略大全...
  18. linux c设置打印机属性,如何恢复打印机属性的“功能”部分
  19. 什么?30秒生成一个logo
  20. Unity二维平面上物体的移动(十一)-位移和推动力移动的区别

热门文章

  1. 036--python--摇骰子游戏
  2. 人工智能设计------------意识可控与意识不可控(三)
  3. 一些时间日期函数,转自华软
  4. boost log使用
  5. 【系统分析师之路】系统分析师知识地图
  6. IEEE Access投稿流程经验分享
  7. Windows事件ID及解释大全
  8. java int和Integer的区别
  9. 汪海Python爬虫(一)抓取网页的含义和URL基本构成
  10. java多个文件加密压缩_Java实现自动压缩文件并加密的方法示例