内存泄露

七擒关羽 2013-09-28 02:36:34

char *fun1()
{
return new char[10];
}

void fun2(char *p)
{
if(NULL != p)
printf("%s\n",p);
//如果不在这里delete p算内存泄漏吗?
}

int main()
{
fun2(fun1());
return 0;
}
...全文
435 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
SmallCoder1992 2013-09-30
  • 打赏
  • 举报
回复
你这个返回指针的函数一般称为工厂函数,如果你不在这个函数外面delete的话,就会容易造成内存泄露
zhangTwei 2013-09-30
  • 打赏
  • 举报
回复
在Boost/STL 采用 smart pointer 指针采用计数器
晓敬 2013-09-30
  • 打赏
  • 举报
回复
引用 3 楼 studyCBC 的回复:
[quote=引用 2 楼 max_min_ 的回复:] 如何你的p之后不再使用的话,而且你的程序又还没有结束的话, 就是内存泄露了! 如果就是这么短小的程序没有释放也伤大雅,因为运行一些就结束了,所用资源都回收了! 但是不建议这么做,new/delete malloc/free最好匹配使用,养成良好的习惯

char *fun1()
{
    return new char[10];
}

template<class T>  
void fun2(T *p)
{
    if(NULL != p)
        printf("%s\n",p);
   //如果我修改为delete
   delete p;
}
  
int main()
{
    fun2(fun1());
    
    short a = 0x01;
    fun2(&a);//怎么让这种情况复用代码
    return 0;
}
[/quote] 你们没有发现这个delete有问题吗?
ri_aje 2013-09-29
  • 打赏
  • 举报
回复
楼主木有听说过 smart pointer 吗。
绿 2013-09-29
  • 打赏
  • 举报
回复
delete 一个指向栈内存 的指针是否合法。 栈空间的释放是不要程序员管的。程序员只能申请,不能释放。离开作用域,就没了。
绿 2013-09-29
  • 打赏
  • 举报
回复
推荐一篇文章http://blog.csdn.net/fhxy_xzw/article/details/8508694
赵4老师 2013-09-29
  • 打赏
  • 举报
回复
无new,无delete new谁,delete谁
lin5161678 2013-09-29
  • 打赏
  • 举报
回复
纠正 但是 整个函数都没有delete 当然会造成内存泄露 应该是 但是 整个进程中都没有delete 当然会造成内存泄露 另外 内存泄露是运行期的事情 对于进程结束 回收资源之类的 不在内存泄露的讨论范围了
lin5161678 2013-09-29
  • 打赏
  • 举报
回复
void fun2(char *p) { if(NULL != p) printf("%s\n",p); //如果不在这里delete p算内存泄漏吗? } 不在这里delete p不算内存泄露 但是 整个函数都没有delete 当然会造成内存泄露 你这里 每一次调用fun1 都会造成不少于10字节的内存块 无法继续在这个进程中使用
lhy 2013-09-29
  • 打赏
  • 举报
回复
引用 11 楼 studyCBC 的回复:
[quote=引用 10 楼 lhylhy 的回复:] [quote=引用 7 楼 studyCBC 的回复:] [quote=引用 5 楼 lhylhy 的回复:] 如果多了肯定有风险,我觉得分配空间应该在fun1这种函数之外。
风险不在于使用多少,这里需要确认的是 delete栈的内存是否是不正确的操作[/quote] new出来的东西和堆栈有什么关系?[/quote] 你没仔细看,我问的是 char a = 10; delete a; 这种是否有风险[/quote] 你在哪里说过char a = 10; delete a;了?你根本没说过的话鬼才能知道你要问什么。
七擒关羽 2013-09-29
  • 打赏
  • 举报
回复
引用 10 楼 lhylhy 的回复:
[quote=引用 7 楼 studyCBC 的回复:] [quote=引用 5 楼 lhylhy 的回复:] 如果多了肯定有风险,我觉得分配空间应该在fun1这种函数之外。
风险不在于使用多少,这里需要确认的是 delete栈的内存是否是不正确的操作[/quote] new出来的东西和堆栈有什么关系?[/quote] 你没仔细看,我问的是 char a = 10; delete a; 这种是否有风险
lhy 2013-09-29
  • 打赏
  • 举报
回复
引用 7 楼 studyCBC 的回复:
[quote=引用 5 楼 lhylhy 的回复:] 如果多了肯定有风险,我觉得分配空间应该在fun1这种函数之外。
风险不在于使用多少,这里需要确认的是 delete栈的内存是否是不正确的操作[/quote] new出来的东西和堆栈有什么关系?
ranky2009 2013-09-29
  • 打赏
  • 举报
回复
坚决不能在fun2(T *p)中调用delete p!!! 你可以在fun2中检查P是否为NULL,来执行相应操作,但是你没有权利delete p,因为p并非在fun2种new! 设计规范很重要 char *fun1(){return new char[10];} 这个写法你觉得好么。。。。。。
七擒关羽 2013-09-28
  • 打赏
  • 举报
回复
引用 5 楼 lhylhy 的回复:
如果多了肯定有风险,我觉得分配空间应该在fun1这种函数之外。
风险不在于使用多少,这里需要确认的是 delete栈的内存是否是不正确的操作
Adol1111 2013-09-28
  • 打赏
  • 举报
回复
把fun2(fun1());拆开写,这样写本身就是有一定问题的。fun1先返回给一个指针,然后再把指针传入fun2 其实拆开也不推荐,按照《effective C++(第三版)》的条款21,宁可返回对象的拷贝,也不要返回(局部)对象的引用和new出来的对象。你这样做等于是把delete的责任抛给了其他人,脱离这个函数之后就不管了。这样很容易引起内存泄漏问题了。就像你这里使用的一样,到底fun2里应不应该delete?如果传进来的是普通指针又怎么办?这种方式无异于自添烦恼,而且还得不到统一的解决办法。 fun1返回对象的拷贝就可以了,fun2里不要用delete,这样比较彻底,虽然可能会发生拷贝等其他问题,但绝对比你现在的方法要好。
lhy 2013-09-28
  • 打赏
  • 举报
回复
如果多了肯定有风险,我觉得分配空间应该在fun1这种函数之外。
七擒关羽 2013-09-28
  • 打赏
  • 举报
回复
就是说这种处理是否有风险
七擒关羽 2013-09-28
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
如何你的p之后不再使用的话,而且你的程序又还没有结束的话, 就是内存泄露了! 如果就是这么短小的程序没有释放也伤大雅,因为运行一些就结束了,所用资源都回收了! 但是不建议这么做,new/delete malloc/free最好匹配使用,养成良好的习惯

char *fun1()
{
    return new char[10];
}

template<class T>  
void fun2(T *p)
{
    if(NULL != p)
        printf("%s\n",p);
   //如果我修改为delete
   delete p;
}
  
int main()
{
    fun2(fun1());
    
    short a = 0x01;
    fun2(&a);//怎么让这种情况复用代码
    return 0;
}
max_min_ 2013-09-28
  • 打赏
  • 举报
回复
如何你的p之后不再使用的话,而且你的程序又还没有结束的话, 就是内存泄露了! 如果就是这么短小的程序没有释放也伤大雅,因为运行一些就结束了,所用资源都回收了! 但是不建议这么做,new/delete malloc/free最好匹配使用,养成良好的习惯
pathletboy 2013-09-28
  • 打赏
  • 举报
回复
内存泄漏是,如果用不到的内存你没进行释放,就算,如果你觉得printf后p所指向的内存不再被别的任何地方所使用,那么就该进行释放。但是本着谁创建谁释放的原则,建议在函数外部进行释放。

65,184

社区成员

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

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