文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>【原】函数返回指针,指向的内存谁来释放?

【原】函数返回指针,指向的内存谁来释放?

时间:2010-09-23  来源:He,YuanHui

    好几年没用C/C++了,由于项目需要,重拾C/C++,使用中时不时的有种亲切感涌来。由于C/C++的自由,让人痛苦但更是让人喜欢的原因,一些经验和技巧显得尤为重要。

    最近总是想不明白,一个函数返回一个内存或者对象的指针,那么这个指针指向的对象(内存)到底由谁来释放?要知道,函数返回指针,通常是给外部临时使用的,其指向的内存通常由函数或者成员函数所在的对象自己来管理,其实就是遵从一个原则:自己的事自己做。

    如果返回一个函数中的临时变量地址,很显然,当执行return后,出了临时变量的作用区,变量将被销毁,这个指针指向的内存就被释放掉了,系统可能在任何时候修改它,这个指针实际变成了野指针,外部使用它是相当危险的;

    如果函数是个类的成员函数,我们能想到的是在对象中申明一个指针,由对象来管理它,成员函数只管使用,但问题是,如果有很多这样的函数,岂不是有很多这样的、只为函数存在的一些奇奇怪怪的指针?

    实际上,解决办法很简单——使用静态变量!——前面不是空了,而是白了,想看的,自己先想想答案,然后再想办法看吧 :0

来段代码:

 


// 取得Xml元素的值
// itemName:元素名
// buff:查找缓冲区
// return:value字符串
char* XmlPack::getElementValue(char* itemName, char* buff)
{
    static char value[64];

    int itemLen = strlen(itemName);

    char* itemStart = new char[itemLen + 3];
    memset(itemStart, '\0', itemLen + 3);
    itemStart[0] = '<';
    itemStart[itemLen + 1] = '>';
    strncpy(itemStart+1*sizeof(char), itemName, itemLen);

    char* itemEnd = new char[itemLen + 4];
    memset(itemEnd, '\0', itemLen + 4);
    itemEnd[0] = '<';
    itemEnd[1] = '/';
    itemEnd[itemLen + 2] = '>';
    strncpy(itemEnd+2*sizeof(char), itemName, itemLen);

    char* pos1 = strstr(buff, itemStart);
    if(pos1 != NULL)
    {
        pos1 += strlen(itemStart);
        char* pos2 = strstr(pos1, itemEnd);
        if(pos2 != NULL)
        {
            assert((unsigned int)(pos2-pos1)<sizeof(value));
            memset(value, '\0', sizeof(value));
            strncpy(value, pos1, pos2-pos1);
            return value;
        }
    }
    return NULL;
}

 

 

 

相关阅读 更多 +
排行榜 更多 +
三角符文第一章下载

三角符文第一章下载

角色扮演 下载
嘀嘀动画官方正版下载

嘀嘀动画官方正版下载

趣味娱乐 下载
像素世界僵尸危机安卓版

像素世界僵尸危机安卓版

飞行射击 下载