内存泄漏真的是C++的软肋吗?

pgmsoul 2011-02-24 01:00:10
我一般是这样使用内存的,我写了一个Memory 类,使用SetLength函数分配内存,。。。。好多常用的函数。

我从来不用new,所有的Memory实例都会自动销毁。

这种思路下,反正我从来没有出现过内存泄漏的问题。

需要new的地方,我都会用类封装,确保一定会delete。然后使用这个封装的类来操作,而不是在程序里去new,delete。
...全文
423 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww884203 2011-02-25
  • 打赏
  • 举报
回复
其实C++自己就有智能指针,而且也推荐不使用new和delete。当然自己写的更加熟悉,不过我还是喜欢new和delete。。。当然我境界不够也没有编写大型软件的经验,可能以后会比较喜欢lz的方式吧,现在还是觉得一个shared_ptr名字太长了
赵4老师 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 milkylove 的回复:]
楼主说不用new,那就是放弃使用指针了呗。不使用指针无非就是抛弃了性能,抛弃了C++的优点。
[/Quote]
不用new也可以对静态数组使用指针。比如
static char s[256];
strcpy(s,"ABC");
节选自c:\Microsoft SDK\src\crt\strcat.c
/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
* Copies the string src into the spot specified by
* dest; assumes enough room.
*
*Entry:
* char * dst - string over which "src" is to be copied
* const char * src - string to be copied over "dst"
*
*Exit:
* The address of "dst"
*
*Exceptions:
*******************************************************************************/

char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;

while( *cp++ = *src++ )
; /* Copy src over dst */

return( dst );
}
yanran_hill 2011-02-25
  • 打赏
  • 举报
回复
我觉得:应用不同,所以无法比较,确实C++在内存方面,在语法规则方面,都许多严格的要求,不了解这些的话很难写出稳定而高效的程序,所以如果是开发一些比如桌面系统、B/S系统、数据库应用,还是用Java或者C#比较靠谱。
不过C++在应用方面,还是有其它语言无法接触的领域,比如QT,比如嵌入式开发,这应该也是C++存在的原因
leoLQ9239339 2011-02-25
  • 打赏
  • 举报
回复
是的 用好了指针方便,用不好出错
失落的凡凡 2011-02-24
  • 打赏
  • 举报
回复
楼主说不用new,那就是放弃使用指针了呗。不使用指针无非就是抛弃了性能,抛弃了C++的优点。
华亭真人 2011-02-24
  • 打赏
  • 举报
回复
借鉴COM的实现

借鉴Android的RefBase实现.
taodm 2011-02-24
  • 打赏
  • 举报
回复
楼主要能做个大点的程序而还能保持完全没有new,就够神的级别了。
iambic 2011-02-24
  • 打赏
  • 举报
回复
对于简单的程序,任何语言都不会有任何问题。真正的问题都是在规模增长到一定程度才暴露出来的。
healer_kx 2011-02-24
  • 打赏
  • 举报
回复
其实没有那么严重了,国内好多软件,QQ,360,金山,哪有那么多内存泄露,这些软件几乎是天天都开着的。
pathuang68 2011-02-24
  • 打赏
  • 举报
回复
1. 指针式C/C++导致memory leak的罪魁祸首,但也是其高性能、最有魅力的一部分。
2. Java有内存回收机制,但内存何时被系统回收,不是由程序员控制的,因此当有大量的内存明明可以重用了,但系统就是由于某种原因没有回收,你只能站在傍边干着急。
3. 极端情况下,Java也会内存泄露的。

事物都有两面性。
温暖阳光236 2011-02-24
  • 打赏
  • 举报
回复
应该怎么才能阻止内存泄露呢
昵称很不好取 2011-02-24
  • 打赏
  • 举报
回复
shared_ptr,还是很好的选择
在栈上不太灵活啊
飞天御剑流 2011-02-24
  • 打赏
  • 举报
回复
呵呵,别高兴太早了,类并不能完美地解决所有问题,构造函数运行期间产生一个异常就揭菜了,这个时候智能指针依然是好选择。
herman~~ 2011-02-24
  • 打赏
  • 举报
回复
不想用delete,个人推荐使用 智能指针
pgmsoul 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ptrunner 的回复:]

你的memory怎样实现自动销毁呢?如果在A处分配内存,忘记在B处释放的话,难道你可以知道我应该在B处销毁内存吗?


[/Quote]

只用对象,析构函数自动释放内存啊。全局的就声明为类的成员,局部的就是一个局部对象。

Memory m;
m.SetLength(100);
memcpy(m.Handle(),str,100);
赵4老师 2011-02-24
  • 打赏
  • 举报
回复
检查是否内存泄漏的办法之一:
任务管理器 进程 查看 选择列 内存使用
任务管理器 进程 查看 选择列 虚拟内存大小
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上两个数值,再隔至少一小时,越长越好,比如一个月,再记录以上两个数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有内存泄漏!
欣客 2011-02-24
  • 打赏
  • 举报
回复
不过我到觉得挺好用的。。。
「已注销」 2011-02-24
  • 打赏
  • 举报
回复
其实更好的选择是智能指针,例如:std::shared_ptr,而不是自己实现一个。
当然,内存池例外。
pstrunner 2011-02-24
  • 打赏
  • 举报
回复
你的memory怎样实现自动销毁呢?如果在A处分配内存,忘记在B处释放的话,难道你可以知道我应该在B处销毁内存吗?

[Quote=引用楼主 pgmsoul 的回复:]
我一般是这样使用内存的,我写了一个Memory 类,使用SetLength函数分配内存,。。。。好多常用的函数。

我从来不用new,所有的Memory实例都会自动销毁。

这种思路下,反正我从来没有出现过内存泄漏的问题。

需要new的地方,我都会用类封装,确保一定会delete。然后使用这个封装的类来操作,而不是在程序里去new,delete。
[/Quote]
wei801516 2011-02-24
  • 打赏
  • 举报
回复
双刃剑哦!~
加载更多回复(2)

65,210

社区成员

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

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