免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 3720 | 回复: 25
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-04 12:00 |只看该作者 |倒序浏览
大家都知道经典c,c++都说分配了堆上的内存需要用户释放,但是有时候我们会遇到这样两难的问题,如下实例
char * test()
{
      char * p = new char [10];
      ...
      return p;
}
void main()
{
      ...
      str=test();
      ...
}
用new分配了内存,使用之后,应当用delete释放,可是我们应该在哪里释放呢,如果在test里面释放,则返回的指针p内容是不对的,如果不释放,又会有内存泄漏,请高手指点,谢谢啦。

论坛徽章:
0
2 [报告]
发表于 2007-04-04 12:18 |只看该作者
原帖由 lhftonny 于 2007-4-3 20:00 发表
大家都知道经典c,c++都说分配了堆上的内存需要用户释放,但是有时候我们会遇到这样两难的问题,如下实例
char * test()
{
      char * p = new char [10];
      ...
      return p;
}
void main()
...

就这个例子的话,应该在main函数里面delete。

论坛徽章:
0
3 [报告]
发表于 2007-04-04 12:46 |只看该作者
str用完以后释放,需要自己记清楚,万一忘了,就真麻烦了

论坛徽章:
0
4 [报告]
发表于 2007-04-04 12:46 |只看该作者
如果用C++,请参TC++PL 14.4
主要技术:资源申请即初始化




  1. #include <iostream>
  2. #include <memory>

  3. class X {
  4. public:
  5.         X(int n = 20) : ptr(new char[n]) { strcpy(ptr, "Hello, world"); }
  6.         // X(const X&);
  7.         //~X() { delete[] ptr; }

  8.         // X& operator=(const X&);

  9.         char* operator->() const { return ptr;}
  10.         // operator char*() const { return ptr;}
  11.         // char* operator()() const { return ptr; }
  12. private:
  13.         char* ptr;
  14. };

  15. int main()
  16. {
  17.         char* p = 0;

  18.         {
  19.                 X x;
  20.                 p = x.operator->();
  21.                 // p = x;
  22.                 // p = x();
  23.                 std::cout << p << std::endl;
  24.         }
  25.         // p指向的存储空间未被释放(class X中去掉在析够函数上的注释,就可以了)
  26.         std::cout << p << std::endl;

  27.         return 0;
  28. }


复制代码

[ 本帖最后由 westgarden 于 2007-4-5 11:54 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-04-04 12:56 |只看该作者
遇到这种情况,尽量使用全局变量,
虚构函数是最好的释放地方

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

论坛徽章:
0
7 [报告]
发表于 2007-04-04 15:17 |只看该作者
另外,我们如果在main中delete 上面的str,程序会down掉的,大家可以试试,这又该怎么办呢?

论坛徽章:
0
8 [报告]
发表于 2007-04-04 15:19 |只看该作者
装个垃圾回收器吧

论坛徽章:
0
9 [报告]
发表于 2007-04-04 15:24 |只看该作者
原帖由 lhftonny 于 2007-4-4 15:17 发表
另外,我们如果在main中delete 上面的str,程序会down掉的,大家可以试试,这又该怎么办呢?


不会吧?

论坛徽章:
0
10 [报告]
发表于 2007-04-04 20:47 |只看该作者
我觉得还是要遵循“谁申请,谁释放”的原则,配对使用。
或者“智能指针”?这个高级东西,还没用过。
反正内存管理,是个麻烦的东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP