C++类内静态成员的内存释放问题

 前言:众所周知如果一个资源一旦读入就不需要修改,且多个线程都加载读取访问这个资源,那咱们就可以将这个资源声明为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即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值