有效防止代码内存泄漏的方法
作者:网络转载 发布时间:[ 2013/1/14 10:26:04 ] 推荐标签:
这样行了,解决上面的情况。让成员变量成为const指针,这样设计也合理,避免指针无意被改变。
Image * const pImg; //图像
Voice * const pVoi; //声音
那么这样只能用成员初始化列表为指针初始化,没有其他地方可以给const指针赋值了。
People::People( const std::string& n,const int& a,const int& h,const std::stirng& imgFileName,const std::string& vFileName )
:name(n),age(a),height(h),
pImg( imgFileName !="" ? new Image( imgFileName ) : 0 ),
pVoi( vFileName != "" ? new Voice( vFileName ) : 0)
{}
如果这样重新回到上面所遇到的问题,即构造过程中抛出异常,指针可能无法正确的释放所占内存。那么我们可以进一步对代码进行改进,如下:
People::People( const std::string& n,const int& a,const int& h,const std::stirng& imgFileName,const std::string& vFileName )
:name(n),age(a),height(h),
pImg( initImage( imgFileName ) ),
pVoi( initVoice( vFileName ) )
{}
Image* People::initImage(const string& imgFileName)
{
if(imgFileName !="") return new Image(imgFileName);
else return 0;
}
Voice* People::initVoice(const string& vFileName)
{
try
{
if(vFileName !="")return new Voice(vFileName)
esle return 0;
}
catch(... )
{
delete pImg;
throw;
}
}
这样在调用构建Voice对象中加入try...catch...用于释放pImg所占用的内存空间。其实有一个比其更简单的方法是使用智能指针。
const auto_ptr<Image> pImg;
const auto_ptr<Voice> pVoi;
People::People( const std::string& n,const int& a,const int& h,const std::stirng& imgFileName,const std::string& vFileName )
:name(n),age(a),height(h),
pImg( imgFileName !="" ? new Image( imgFileName ) : 0 ),
pVoi( vFileName != "" ? new Voice( vFileName ) : 0)
{}
那么问题算解决了,因为当其中有一个创建失败,离开函数的时候,智能指针会自动删除已经创建的空间,防止内存泄漏了。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11