为了账号安全,请及时绑定邮箱和手机立即绑定

私有的静态成员指针指向一块堆内存,如何释放这个堆内存?

私有的静态成员指针指向一块堆内存,如何释放这个堆内存?

慕桂英546537 2019-04-13 08:36:34
bruce@bruce-localhost~$cattest.cc#include#includeclassTest{public:staticvoidallocate(size_tn){ptr=(int*)::malloc(n);*ptr=4;}~Test(){std::cout
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

既然你专门写了一个allocate来分配内存,为什么不写一个free来释放内存呢
cpp#include
#include
classTest
{
public:
staticvoidallocate(size_tn)
{
ptr=(int*)::malloc(n);
*ptr=4;
}
staticvoidfree(){
free(ptr);
}
private:
staticint*ptr;
};
int*Test::ptr=nullptr;
intmain()
{
Test::allocate(sizeof(int));
return0;
Test::free();
}
如果你想在析构函数中释放,也不是不可能,但是注意不要重复释放,而且,如果没有对象,就不会产生析构。
cpp~Test()
{
std::cout<<"helloworld"<free(ptr);
ptr=nullptr;//<--注意这句
}
                            
查看完整回答
反对 回复 2019-04-13
?
BIG阳

TA贡献1859条经验 获得超6个赞

楼上使用两个静态函数实现了你要的东西,我推敲楼主的意思是否是想用析构函数来自动释放堆申请的内存,
如果是这种场景,使用单例类可以满足:
classTest
{
public:
//带缓冲池的的内存分配实现
char*allocate(size_tn)
{
if(NULL==m_ptrStart){
//简单考虑最大申请1000,真实场景可使用链表来链接每一块内部申请的大内存;
m_ptrStart=(char*)::malloc(1000);
m_ptrCur=m_prtStart;
}
char*ptr=m_ptrCur;
m_ptrCur+=n;
returnptr;
}
~Test(){
free(m_ptrStart);
m_ptrStart=NULL;
}
staticTest*getInstance()
{
if(NULL==s_pTest)
s_pTest=newTest();
returns_pTest;
}
private:
Test(){m_ptrStart=NULL;m_ptrCur=NULL;}
char*m_ptrStart;//内存分配首地址
char*m_ptrCur;//当前未使用的内存
staticTest*s_pTest;//单例
};
Test*Test::s_pTest=NULL;
使用:
char*p1=Test::getInstance()->allocate(4);
char*p2=Test::getInstance()->allocate(8);
p1/p2用完后不用释放,单例析构时释放所有内存;
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 324 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号