C++类的静态成员怎么析构
class A{
A();
~A();
static ClassB *b;
}
A::A(){
b = new ClassB();
}
那个b的空间如何释放 展开
你需要把静态成员看成一个全局对象。
class A{
A();
~A();
static ClassB *b;
}
A::A(){
b = new ClassB();
}
这样是不合理的,这里static ClassB *b;,b是一个指针变量,存储在静态存储区,程序代码在加载进入内存开始执行后就会为b分配可用内存,你需要在类外定义static成员并初始化 ClassB *A::b = ...;
如果你需要动态让b = new ClassB();,那么请记住,b永远只有一个,你所有A对象的操作都是在操作同一个b,如果你建立如上代码,那么有:
A a1;
A a2;时,b = new ClassB();执行了两次,但是却没有对应的delete,所以会内存泄露
如果非得 new ClassB();那你可以在执行初始化b的时候 new ClassB();,然后在不需要的时候delete
如果你非得在A构造中 new ClassB();你可以先判断
if(!b)
b = new ClassB();
但是不要随便在A析构delete,因为保不准a1析构了,a2还要用b。
所以,何时delete,得看你哪个时候需要,如果程序 运行期间都不会delete,那你程序退出也就没必要delete了,操作系统自动回收内存。
另外,如果你的静态成员是
static classB b;
那么更不需要你析构了,程序结束时,自动调用析构。
下一条:如果要实现A构造析构中智能的对b进行构造析构,可以使用计数手段,A构造中
if(!b)
b = new....;
++计数变量(必须是全局内存上的,可以是static成员);
然后析构就--计数变量;
然后判断计数变量是否为0,如果是,那么就没有A对象在使用b了,可以释放b了。
具体的,参考c++的auto_ptr
2023-08-29 广告
因此它只需要单独析构一次。
具体到你这个,比如就可以这样;
A::~A(){
if(b)delete b;
}
或者
int main(){
……
delete b;
return 0;
}
A::~A(){
if (NULL != b)
{
delete b;
b = NULL;
}
}
欢迎采纳!
首先:静态成员变量应该在类外初始化
其次:看看这里吧C++ 类的静态成员变量指针如何释放
静态成员的定义或声明要加个关键static。
静态成员可以通过双冒号来使用即<类名>::<静态成员名>。
在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。