好几年没用C/C++了,由于项目需要,重拾C/C++,使用中时不时的有种亲切感涌来。由于C/C++的自由,让人痛苦但更是让人喜欢的原因,一些经验和技巧显得尤为重要。
最近总是想不明白,一个函数返回一个内存或者对象的指针,那么这个指针指向的对象(内存)到底由谁来释放?要知道,函数返回指针,通常是给外部临时使用的,其指向的内存通常由函数或者成员函数所在的对象自己来管理,其实就是遵从一个原则:自己的事自己做。
如果返回一个函数中的临时变量地址,很显然,当执行return后,出了临时变量的作用区,变量将被销毁,这个指针指向的内存就被释放掉了,系统可能在任何时候修改它,这个指针实际变成了野指针,外部使用它是相当危险的;
如果函数是个类的成员函数,我们能想到的是在对象中申明一个指针,由对象来管理它,成员函数只管使用,但问题是,如果有很多这样的函数,岂不是有很多这样的、只为函数存在的一些奇奇怪怪的指针?
实际上,解决办法很简单——使用静态变量!——前面不是空了,而是白了,想看的,自己先想想答案,然后再想办法看吧 :0
来段代码:
//取得Xml元素的值
//itemName:元素名
//buff:查找缓冲区
//return:value字符串
charXmlPack::getElementValue(charitemName,charbuff)
{
staticcharvalue[64];
intitemLen=strlen(itemName);
charitemStart=newchar[itemLen+3];
memset(itemStart,'\0', itemLen+3);
itemStart[0]='<';
itemStart[itemLen+1]='>';
strncpy(itemStart+1sizeof(char), itemName, itemLen);
charitemEnd=newchar[itemLen+4];
memset(itemEnd,'\0', itemLen+4);
itemEnd[0]='<';
itemEnd[1]='/';
itemEnd[itemLen+2]='>';
strncpy(itemEnd+2sizeof(char), itemName, itemLen);
charpos1=strstr(buff, itemStart);
if(pos1!=NULL)
{
pos1+=strlen(itemStart);
char*pos2=strstr(pos1, itemEnd);
if(pos2!=NULL)
{
assert((unsignedint)(pos2-pos1)<sizeof(value));
memset(value,'\0',sizeof(value));
strncpy(value, pos1, pos2-pos1);
delete[] itemStart;
delete[] itemEnd;
returnvalue;
}
}
delete[] itemStart;
delete[] itemEnd;
returnNULL;
}
但是需要特别注意的是,使用局部静态变量是线程不安全的,是一个不可重入函数。
解决这个问题的标准、权威的做法还是调用者提供存储空间,通过参数传入地址,这样,调用者可以使用局部变量来获取处理结果。这种方式麻烦,但是权威。下面一段文字来自Sun公司对多线程模型的讨论(《多线程编程指南》• 2006年10月,P231, 所有权归Sun公司所有):
原文链接: https://www.cnblogs.com/khler/archive/2010/09/23/1833458.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/15316
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!