c++避免内存泄漏
2016-08-04 19:21
183 查看
一旦将c++用的十分纯熟了,忘掉了c++里的各种“特性”,避免接近很多"坑",会发现c++其实还是有很多优点的,比如避免内存泄漏。
我们发送消息的代码在c语言中常常这样写
Message* m=CreateMessage();
SendMessage(m);
如果在上述两句之间有很多代码,一不小心就会有内存泄漏。ps:很多c++程序也是这样写的,其实没有领悟c++的精髓。
我们稍微封装一下
class NetPacket
{
public:
~NetPacket()
{
if(_m)
DestroyMessage(_m);
}
NetPacket()
{
_m=CreateMessage();
}
Message* Exchange()
{
Message* m=_m;
_m=nullptr;
return m;
}
private:
Message* _m;
};
void SendNetPacket(NetPacket& pack)
{
Message* m=pack.Exchange();
SendMessage(m);
}
NetPacket pack;
SendNetPacket(pack);
妈妈再也不用担心内存泄漏了。
事实上,这种同一函数内部的内存泄漏问题都可以利用c++的析构函数来自动解决。你永远不会看到c代码里面类似
goto freeresouce1;goto freeresource2之类的代码。
当然你可以说你的功底深厚不会发生这种低级错误。但是谁能保证自己永不犯错呢?
跨越函数的内存泄漏问题就没简单的办法解决了,毕竟内存问题是c和c++的固有问题。个人不建议用智能指针,智能指针本身就是个问题,这也是c++被很多c程序员黑的原因之一,毕竟c++槽点太多了。
我们发送消息的代码在c语言中常常这样写
Message* m=CreateMessage();
SendMessage(m);
如果在上述两句之间有很多代码,一不小心就会有内存泄漏。ps:很多c++程序也是这样写的,其实没有领悟c++的精髓。
我们稍微封装一下
class NetPacket
{
public:
~NetPacket()
{
if(_m)
DestroyMessage(_m);
}
NetPacket()
{
_m=CreateMessage();
}
Message* Exchange()
{
Message* m=_m;
_m=nullptr;
return m;
}
private:
Message* _m;
};
void SendNetPacket(NetPacket& pack)
{
Message* m=pack.Exchange();
SendMessage(m);
}
NetPacket pack;
SendNetPacket(pack);
妈妈再也不用担心内存泄漏了。
事实上,这种同一函数内部的内存泄漏问题都可以利用c++的析构函数来自动解决。你永远不会看到c代码里面类似
goto freeresouce1;goto freeresource2之类的代码。
当然你可以说你的功底深厚不会发生这种低级错误。但是谁能保证自己永不犯错呢?
跨越函数的内存泄漏问题就没简单的办法解决了,毕竟内存问题是c和c++的固有问题。个人不建议用智能指针,智能指针本身就是个问题,这也是c++被很多c程序员黑的原因之一,毕竟c++槽点太多了。
相关文章推荐
- 快速入门C++ 12(避免内存泄漏)
- C++程序内存泄漏都与哪些方面有关,该如何处理和避免
- C++内存泄漏问题务必要避免!
- C++内存泄漏和内存碎片的产生及避免策略
- C++避免内存泄漏的一种技巧
- c/c++中内存泄漏的检查与避免
- C++如何避免内存泄漏
- C++ 传值 避免 内存泄漏的一个技巧。[new 了以后,不一定要delete][修正,new后一定delete,没人帮你释放的。我错了,此文章已没任何意义了]
- c++避免内存泄漏
- C++箴言:避免析构函数调用虚函数
- 一个跨平台的 C++ 内存泄漏检测器
- C++内存泄漏——C++中动态内存分配引发问题的解决方案(2)
- 浅谈C/C++内存泄漏及其检测工具
- 正确使用 SharePoint 对象避免内存泄漏
- C/C++内存泄漏检测工具Parasoft Insure++视频操作免费下载
- C++内存泄漏检测
- 菜鸟也能搞定C++内存泄漏
- [转帖]C++项目避免线程死锁的体会
- 浅谈C/C++内存泄漏及其检测工具
- 一个跨平台的 C++ 内存泄漏检测器