你的项目是怎么做内存管理的

dreamcs 2010-07-19 06:21:52
以前用c#开发程序,几乎不用考虑这个问题。现在用c++开发程序,必须得考虑处理这个问题了。
我看了几个大型的c++几乎都是自己实现的内存管理。发现使用smart pointer的非常少。不知道
大家的项目,是怎么做内存管理的?
...全文
390 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
结贴。谢谢大家的讨论。
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
ls看看这篇文章
《最快速度找到内存泄漏》
http://blog.csdn.net/xushiweizh/archive/2006/12/20/1451083.aspx

我是菜鸟。
hgxinyu 2010-07-20
  • 打赏
  • 举报
回复
高人指导一下为什么要那么复杂?

用以下函数不是可以做内存泄漏检测么?


void MemLeakChk()
{
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
}

dreamcs 2010-07-20
  • 打赏
  • 举报
回复
假设出现以下描述的情况,应该怎么用Boost, or STL来处理。
设a为被引用对象,b, c, d, e在程序的不同位置引用a对象。
a,b,c,d,e都是同一个类的指针。
现在a的内存被释放了,b,c,d,e在使用a就会出错了。

这问题应该很清楚了。
我们程序已经解有一套解决方法了,我们称之为“智能链表”。
我嫌它麻烦,不好扩展和维护,所以想看看还有什么样的
其它的解决方法。
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 iambic 的回复:]

先搞清楚你要解决什么问题。基本的分配归还对象不会?
[/Quote]

"分配归还对象"这是什么意思?打错字了么。
cobra_chen 2010-07-20
  • 打赏
  • 举报
回复
STL比较好
iambic 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 dreamcs 的回复:]

"boost::object_pool的了不起之处在于,这是C++从库的层次上头一次承认,程序员在内存管理上是会犯错误的,由程序员来确保内存不泄漏是困难的。boost::object_pool允许你忘记释放内存。我们来看一个例子:"
http://blog.csdn.net/xushiweizh/archive/2007/04/21/1574015.aspx

见金山的许世伟的blog
……
[/Quote]
这话说的太危言耸听了吧。boost::object_pool以前没有对象池?
iambic 2010-07-20
  • 打赏
  • 举报
回复
先搞清楚你要解决什么问题。基本的分配归还对象不会?
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
"boost::object_pool的了不起之处在于,这是C++从库的层次上头一次承认,程序员在内存管理上是会犯错误的,由程序员来确保内存不泄漏是困难的。boost::object_pool允许你忘记释放内存。我们来看一个例子:"
http://blog.csdn.net/xushiweizh/archive/2007/04/21/1574015.aspx

见金山的许世伟的blog
机智的呆呆 2010-07-20
  • 打赏
  • 举报
回复
一个合格c++的程序员用new/delete来管理内存是基本功~~~
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
谢谢yshuise
我看一下。
yshuise 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 dreamcs 的回复:]
假设出现以下描述的情况,应该怎么用Boost, or STL来处理。
设a为被引用对象,b, c, d, e在程序的不同位置引用a对象。
b,c,d,e为智能指针。
现在a的内存被释放了,b,c,d,e在使用a就会出错了。
这种情况很常见的。对象的指针在复杂的环境中被传来传去。
如果有哪段代码不小心释放了内存。就等着崩溃吧。我们的程序有两
三百万行代码。要从这种代码量的工程中找……
[/Quote]
读一下boost::shared_ptr文档吧,这个问题仍然可以解决。对于嵌套防止循环引用即可。
yshuise 2010-07-20
  • 打赏
  • 举报
回复
boost::pool
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
能细说说么?
zhh_kv 2010-07-20
  • 打赏
  • 举报
回复
封装自己的内存管理类
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
总结了一下各位的方法:
如下:
[1]检视代码+内存检测工具
[2]自己实现一个专门管理内存的队列
[3]智能指针.

不知道还有没有别的方法了。
taodm 2010-07-20
  • 打赏
  • 举报
回复
既然b,c,d,e为智能指针,a的内存就绝不可能被释放。
dreamcs 2010-07-20
  • 打赏
  • 举报
回复
假设出现以下描述的情况,应该怎么用Boost, or STL来处理。
设a为被引用对象,b, c, d, e在程序的不同位置引用a对象。
b,c,d,e为智能指针。
现在a的内存被释放了,b,c,d,e在使用a就会出错了。
这种情况很常见的。对象的指针在复杂的环境中被传来传去。
如果有哪段代码不小心释放了内存。就等着崩溃吧。我们的程序有两
三百万行代码。要从这种代码量的工程中找出这样的错误是非常困难的。


cattycat 2010-07-20
  • 打赏
  • 举报
回复
为了安全,你还是用boost和Stl这种库。
liuwei2500 2010-07-20
  • 打赏
  • 举报
回复
C#里面有自带的内存管理机制,你甚至只需要用{}这样的一个标示就可以让在里面申明的东西自动释放,加上他的GC垃圾回收区会监视并回收不用的内存空间。所以你根本就不用担心。
在C++里面,你申明的东西不释放那么你的程序从开始执行一直到关闭才会被释放,有的申明的东西会一直存在于直到你电脑重启。所以要求有严格的代码自主管理。有申明就有释放,有构造就有析构。new 了就要delete
加载更多回复(21)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧