免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lhftonny
打印 上一主题 下一主题

请教关于new和delete的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-04-04 21:19 |只看该作者
原帖由 lhftonny 于 2007-4-4 14:07 发表
谢谢楼上的各位,我想也是这样,但是之所以这样问是因为实际中例子可能会更加复杂,如
char * test()
{
      char * p = new char [10];
      ...
      return p;
}
void main()
{
      ...
      memcpy(deststr,test(),12;
      ...
}
这样又该怎么办呢?

你这样会内存泄露,你必须将返回的指针用变量保存起来,以便最后不需要时进行释放

论坛徽章:
0
12 [报告]
发表于 2007-04-04 22:21 |只看该作者
配对使用是没有错误,关键在于这种情况不好配对啊,我把例子再说一遍
char * test()
{
      char * p = new char [10];
      ...
      return p;
}
void main1()
{
      ...
      memcpy(deststr,test(),12);
      ...
}
我们必须要回收这块内存,问题是在哪里回收,如果我们在test里面用delete p显然不行,可是如果在main里回收,应该怎么作呢?当然我们可以用一个变量把main改造成下面这样
void main2()
{
      ...
      char *pstr;
      pstr=test();
      memcpy(deststr,pstr,12);
      ...
      delete pstr;
}
可是也有问题,因为这里的pstr是栈上分配的,所以不能用delete来释放,所以上面的main2会down,那么这种情况有没有什么好方法处理呢?

论坛徽章:
0
13 [报告]
发表于 2007-04-04 22:28 |只看该作者

tmp

因为这里的pstr是栈上分配的,所以不能用delete来释放

这是谁告诉你的?

论坛徽章:
0
14 [报告]
发表于 2007-04-04 22:34 |只看该作者
.

最好避免在 C++ 中使用 malloc()/free()。

.

论坛徽章:
0
15 [报告]
发表于 2007-04-04 22:36 |只看该作者
原帖由 lhftonny 于 2007-4-4 22:24 发表
... 因为这里的pstr是栈上分配的,所以不能用delete来释放,所以上面的main2会down ...


pstr是在栈上,但pstr志向的空间不是栈上,而是你test函数在堆上分配的空间。so,你用delete释放的是你pstr指向的test()在堆上所分配的空间,而不是pstr自身的空间。
你可以再回顾一下delete的用法。

论坛徽章:
0
16 [报告]
发表于 2007-04-04 22:52 |只看该作者
char * test()
{
      char * p = new char [10];
      ...
      return p;
}
void main()
{
      ...
      str=test();
      ...
}

建议搂住在main中分配空间,
如char tmp[128]={0};
str = test(tmp,sizeof(tmp));

在test中分配堆的方式,迫使test函数调用者必须要了解其内部实现机制,
并且在使用之后释放堆空间,这种方式很恶心!

[ 本帖最后由 quan229 于 2007-4-4 22:54 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2007-04-04 22:58 |只看该作者
自己先看下  堆  栈 指针  函数返回值  frame看了就搞懂了  
自己google  baidu

论坛徽章:
0
18 [报告]
发表于 2007-04-04 23:12 |只看该作者
就关键几点:
栈在函数调用完成后修改ebp,自动变量所占的内存空间可能被下面的函数栈修改

堆,操作系统sbrk系统调用分配的大块区间,有用户管理,一般用的就是malloc,free等,也可以自己实现。进程结    束后才归还给OS。你不释放的话,只有用没有使用过的,长久下去。。。。
  
data: 进程终止为止
bss:  进程终止为止  OS自动初始化为0;


记住申请了就释放。。。。
注意一定要将内存的释放写在程序所有可能跳出的路径之上,否则条件不满足的话,释放不了,你就挂了

论坛徽章:
0
19 [报告]
发表于 2007-04-04 23:14 |只看该作者
知道进程的内存布局就理解了。。。
随便找都有

论坛徽章:
0
20 [报告]
发表于 2007-04-05 08:46 |只看该作者
可以让test()返回一个resource container


  1. class ReturnType
  2. {
  3.   ~ReturnType()
  4.   {
  5.      // clean resource
  6.   }
  7.   ...
  8. };

  9. ReturnType test()
  10. {
  11.   ...
  12.   return ReturnType(new char[10]);
  13. }

  14. main()
  15. {
  16.     ....
  17.     ReturnType result = test();
  18.     ....
  19. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP