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