前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >类静态指针的申请和释放

类静态指针的申请和释放

作者头像
王亚昌
发布2018-08-03 15:31:18
1.6K0
发布2018-08-03 15:31:18
举报
文章被收录于专栏:王亚昌的专栏

     如果类有一个静态成员指针变量,在进程中执行new或malloc操作分配了内存,进程退出前并不需要调用new或malloc,因为系统会自动进行释放。但这个静态成员指针变量需要多少分配,又应该如果处理呢,最近在项目代码中看到这样的例子,和大家分享一下。

代码语言:javascript
复制
#include <unistd.h>  
#include <stdio.h>  
  
class CPointer  
{  
    public:  
        CPointer(){};  
        ~CPointer(){};  
    public:  
        static char * m_p;  
};  
  
char * CPointer::m_p = NULL;  
  
void proc()  
{  
    for(int i = 0; i < 10; i++)  
    {          
        CPointer::m_p = new char[1024*1024];  
        sleep(1);  
    }  
}  
  
int main(int argc, char ** argv)  
{  
    proc();  
    return 0;      
}  

    用valgrind执行,会发现内存泄漏,如下所示,当然,这是很显然的,多次new但没有delete。

valgrind --tool=memcheck --leak-check=full  ./a.out

==3893== LEAK SUMMARY: ==3893==    definitely lost: 5,242,880 bytes in 5 blocks. ==3893==      possibly lost: 4,194,304 bytes in 4 blocks. ==3893==    still reachable: 1,048,576 bytes in 1 blocks. ==3893==         suppressed: 0 bytes in 0 blocks. ==3893== Reachable blocks (those to which a pointer was found) are not shown. ==3893== To see them, rerun with: --show-reachable=yes

    那应该如何解决呢,当然是应该delete,但是类的静态成员在类的生命周期中是不能delete的,感兴趣的朋友可以试下,进程会core。

    但是可以把静态指针赋给另一个局部指针,把局部指针释放掉,这样,即保存了静态指针,同时,资源也得释放。修改代码如下:

代码语言:javascript
复制
#include <unistd.h>  
#include <stdio.h>  
  
class CPointer  
{  
    public:  
        CPointer(){};  
        ~CPointer(){};  
    public:  
        static char * m_p;  
};  
  
char * CPointer::m_p = NULL;  
  
void proc()  
{  
    for(int i = 0; i < 10; i++)  
    {  
        if (NULL != CPointer::m_p)  
        {  
            char * p = CPointer::m_p;  
            delete []p;  
            p = NULL;  
            CPointer::m_p = NULL;  
        }  
        CPointer::m_p = new char[1024*1024];  
        sleep(1);  
    }  
}  
  
int main(int argc, char ** argv)  
{  
    proc();  
    return 0;      
}  

   再用valgrind执行,问题解决。

==3912== LEAK SUMMARY: ==3912==    definitely lost: 0 bytes in 0 blocks. ==3912==      possibly lost: 0 bytes in 0 blocks. ==3912==    still reachable: 1,048,576 bytes in 1 blocks. ==3912==         suppressed: 0 bytes in 0 blocks. ==3912== Reachable blocks (those to which a pointer was found) are not shown. ==3912== To see them, rerun with: --show-reachable=yes

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010年07月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档