C++类的静态成员怎么析构

比如如下代码classA{A();~A();staticClassB*b;}A::A(){b=newClassB();}那个b的空间如何释放... 比如如下代码
class A{
A();
~A();
static ClassB *b;
}
A::A(){
b = new ClassB();
}

那个b的空间如何释放
展开
 我来答
龚炜林
推荐于2018-03-19 · TA获得超过1560个赞
知道大有可为答主
回答量:1102
采纳率:66%
帮助的人:593万
展开全部
  1. 你需要把静态成员看成一个全局对象。

  2. 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

Storm代理
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I... 点击进入详情页
本回答由Storm代理提供
百度网友5e8499c
2014-04-14 · TA获得超过556个赞
知道小有建树答主
回答量:280
采纳率:100%
帮助的人:312万
展开全部
静态成员变量本质上是全局变量,被所有该类的对象所共享。
因此它只需要单独析构一次。
具体到你这个,比如就可以这样;
A::~A(){
if(b)delete b;
}
或者
int main(){
……
delete b;
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ahcc08
2014-04-14 · 知道合伙人软件行家
ahcc08
知道合伙人软件行家
采纳数:11853 获赞数:51942
拥有丰富的软件开发经验。

向TA提问 私信TA
展开全部
A::~A(){
    if (NULL != b)
    {
        delete b;
        b = NULL;
    }
}

欢迎采纳!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
柯西and黎曼
2020-05-05
知道答主
回答量:8
采纳率:0%
帮助的人:5568
展开全部

首先:静态成员变量应该在类外初始化

其次:看看这里吧C++ 类的静态成员变量指针如何释放

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
du瓶邪
推荐于2016-06-27 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1.7万
采纳率:100%
帮助的人:3035万
展开全部
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
静态成员的定义或声明要加个关键static。
静态成员可以通过双冒号来使用即<类名>::<静态成员名>。
在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式