CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

函数参数中new出来的对象怎么释放?

楼主yangbc(土豆块)2006-11-21 20:52:06 在 C/C++ / C++ 语言 提问

函数参数中new出来的对象怎么释放?  
  比如   void   fuc(new   CEntityString("abcd"),1,5)  
            {  
   
              }  
  这里的new   CEntityString("abcd")   出来的空间还需要释放么?  
  哪位老大讲一下,分数可能不多,大家笑纳 问题点数:100、回复次数:72Top

1 楼owlling(owlman)回复于 2006-11-21 20:57:21 得分 0

new有两种形式,delete于他对应  
  以string为例好了  
  1,string   *s   =   new   string("abc");  
  ////  
  delete   s;  
  2,string   *s   =   new   string[100];  
  ////  
  delete[]   s;Top

2 楼yangbc(土豆块)回复于 2006-11-21 21:00:06 得分 0

哦,楼上的意思我知道,我是想问函数参数中的new的空间在内存中是怎么样存在的,由于没有办法调用delete,所以我不知道怎么释放这样的空间?Top

3 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-21 21:01:45 得分 0

这里的new   CEntityString("abcd")   出来的空间还需要释放么?  
  哪位老大讲一下,分数可能不多,大家笑纳  
  =================  
  只要是new的就需要delete  
   
  注意保存指针,好回收空间Top

4 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-21 21:01:58 得分 0

否则内存泄漏Top

5 楼owlling(owlman)回复于 2006-11-21 21:05:37 得分 0

没有办法delete的话,说明已经出现或者必然导致内存泄漏了,永远不能失去heep上空间的句柄啊。一直到被deleteTop

6 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-11-21 21:20:41 得分 0

不要在C++中使用Java的编译风格。  
   
  CEntityString   *pcs=;new   CEntityString("abcd");  
  fuc(p,1,5);  
  delete   pcs;  
  Top

7 楼lei001(太极)回复于 2006-11-21 21:31:38 得分 0

c++没有内存垃圾回收的  
  应该弄个指针保存地址,以便释放申请的空间的Top

8 楼kenneth_lueng()回复于 2006-11-21 21:59:25 得分 0

没有报错????  
  相当奇怪,还真不知道c++能在函数定义的时候用这种语法  
   
  调用函数用这种语法倒可以,但应该会造成内存的泄漏的Top

9 楼weiym(磨刀霍霍向猪羊)回复于 2006-11-21 22:02:10 得分 0

这样会泄露Top

10 楼chenqing1128(Alex)回复于 2006-11-21 22:32:14 得分 0

可以这样调用的.释放的时候把该参数释放即可.  
  fuc(new   CEntityString("abcd"),1,5);这个只是一个调用.显然不是定义.比如如果楼主的定义是这个样子  
  void   fuc(CEntityString   *p,int   i,int   j);  
  那就在fuc函数里释放:delete   p;如果把p的值传出来了,实际上传得是那个地址,就释放那个地址.  
  其实这个p是形参,你delete   p实际上是释放p所指向的内容而不是p本身.不会有问题的.  
   
  我一直想强调一点的是void   fuc(CEntityString   *p,int   i,int   j);中的p是形参,所以对于地址p来讲是传值而不是传指针.但是对于CEntityString   来说就是传指针了.  
   
  所以楼上凡是说这种方法不对的都对指针不是太了解.  
  总之如下几种方式都可释放:  
  1.  
  必须确保出了fuc后不用这个结构体了CEntityString   ;  
  void   fuc(CEntityString   *p,int   i,int   j)  
  {  
        //do   something  
          delete   p;//必须确保不用这个结构体了CEntityString   ;  
  }  
  2.如果在fuc外面用到比如:  
  void   fuc(CEntityString   *p,int   i,int   j)  
  {  
        //do   something  
          //将p加入一个链表  
  }  
  那就在释放链表的时候释放.Top

11 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-11-21 22:44:07 得分 0

void   fuc(new   CEntityString("abcd"),1,5)  
            {  
   
              }  
  --------------------  
  这里func肯定是错误的,函数调用语法没有这样的,注意后面的{}.函数定义也不能这样用,注意参数,不是变量。Top

12 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-11-21 22:46:46 得分 0

所有new出来的对象都需要delete,不管是不是用做参数,所有new出来的对象都应该保留指针,以便用来delete,不管是指针参数变量,还是普通指针变量。Top

13 楼yangbc(土豆块)回复于 2006-11-21 22:56:48 得分 0

呵呵,我函数调用写错了,花括号是不要的,lann64(昆仑大鹏@迦楼罗)   批评的对Top

14 楼argenCHN(【夷不谋夏,胡不乱华】)回复于 2006-11-22 00:02:09 得分 0

用完了就要记得deleteTop

15 楼yangbc(土豆块)回复于 2006-11-22 11:41:29 得分 0

没有人从内存分配的角度讲一下么?Top

16 楼greengrince(踏雪而行)回复于 2006-11-22 11:58:26 得分 0

都是强人Top

17 楼OOPhaisky(异化$渴望成功~~)回复于 2006-11-22 12:14:39 得分 0

void   fuc(new   CEntityString("abcd"),1,5)  
  {  
   
  }  
  -------------------------------------------------------------------------------------  
  这是在定义函数?没有这种定义方法。  
  如果:  
  void   fuc(CEntityString*   temp,1,5)  
  {  
  ......  
  delete   temp;//此句可以释放内存,避免产生内存泄漏  
  }  
  fuc(new   CEntityString("abcd"),1,5);  
  这样是可以的,即用new构造一个临时对象,然后将指针传递给fuc函数。此时可以在fuc尾部通过delete释放temp指向的内存。但是这里有一个隐含的层面:通过temp传入的指针必须是new分配的,而不能是静态内存区的指针,否则delete的结果未定义。Top

18 楼abblly(西边日出东边雨)回复于 2006-11-22 12:47:04 得分 0

楼主干嘛非要这么做啊,这样的函数,给别人用,别人敢用吗?  
   
  void   fuc(CEntityString*   temp,1,5)  
  {  
  ......  
  delete   temp;//此句可以释放内存,避免产生内存泄漏  
  }  
   
  直接写]  
  void   fuc(CEntityString*   temp,1,5)  
  {  
  ......  
  }  
   
  在调用之前new  
  CEntityString*   temp   =   new   CEntityString;  
  fun(temp);  
  delete岂不更好?不要给自己找麻烦啊  
  Top

19 楼A_snail(蜗)(牛)VS.(钉)(子)回复于 2006-11-22 12:47:29 得分 0

void   fuc(CEntityString*   temp,1,5)  
  {  
  ......  
  delete   temp;//此句可以释放内存,避免产生内存泄漏  
  }  
  ------------------------------------------------------------------  
  赞同这种处理方式;  
   
  另外,若参数是一个类的话,应该也可以通过调用类的析构函数来释放空间吧...  
   
  void   fuc(CEntityString*   temp,1,5)  
  {  
  ......  
    temp->~CEntityString();    
   
  }  
  Top

20 楼chllcy(搬张小板凳,听星星们的高见)回复于 2006-11-22 12:55:52 得分 0

强啊     学习一下Top

21 楼flyfine(城市里的农村人)回复于 2006-11-22 13:35:59 得分 0

我觉得这是一个痞子习惯,首先我不知道你是要写这个函数体呢还是在函数调用。如果是实现函数体的话,那么分配内存的操作为什么不放到函数体中,并且记住该内存地址,以便在函数的最后释放内存。如果是函数调用的话,也最好在调用之前记住申请内存的地址,调用完了之后主动delete掉。   new   总是和delete成对使用的,至少在C++中应该这样。  
                                                                                          ------   随便说点,高手请批Top

22 楼westdot(子思)回复于 2006-11-22 13:52:43 得分 0

显然在函数定义时里面要有一个delete。  
  如定义:  
  void   fun(int   *p,   ...)  
  {  
        ...  
        delete   p;  
  }  
  p只能接受堆内存指针。  
  在函数调用时new对象也不是第一次接触到了,auto_ptr。。。Top

23 楼w_anthony()回复于 2006-11-22 14:02:34 得分 0

fuc(&CEntityString("abcd"),1,5);  
   
  这样呢?Top

24 楼alan001(星岛孤裔林郎君)回复于 2006-11-22 14:32:29 得分 0

引用不是指针,要删除引用????Top

25 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-22 14:39:24 得分 0

函数参数中new出来的对象怎么释放?  
  比如   void   fuc(new   CEntityString("abcd"),1,5)  
  {  
   
  }  
  ========================  
  CEntityString   *   fuc(ptmp   =   new   CEntityString("abcd"),1,5)  
  {  
  ......  
  return   ptmp;  
  }  
   
  主调函数记得的释放,  
  int   main()  
  {  
  CEntityString   *   p   =   fuc(ptmp   =   new   CEntityString("abcd"),1,5);  
  delete   p;  
  }  
  个人意见,高手多多指教Top

26 楼shawnwan()回复于 2006-11-22 14:57:24 得分 0

void   fuc(CEntityString*   temp,1,5)  
  {  
  ......  
  delete   temp;  
  }  
  不DELETE是会内存丢失哦,  
  其实就算头文件内没定义成   (CEntityString*   temp,1,5),也可以在实现的地方实现,因为C++,C编译器都没把参数名字当做参数,名字只是给程序员做标记用的。编译器只是根据类型和定义的顺序来进行函数的编译。  
  所以这里LZ的方法是自己找不到对TEMP内存的描述,当然不能够进行DELETE啦  
  Top

27 楼w_anthony()回复于 2006-11-22 15:14:10 得分 0

w_anthony()   ----------------------------  
  fuc(&CEntityString("abcd"),1,5);  
   
  这样呢?  
   
  alan001(星岛孤裔林郎君)-----------------  
   
  引用不是指针,要删除引用????  
   
  ----------------------------------------  
   
  是说我吗?这样写就是把临时对象的地址传进去,根本不用删除,也不会有内存泄露吧!?Top

28 楼Nowish(看我能忍耐多久)回复于 2006-11-22 16:29:22 得分 0

mark~Top

29 楼breakout()回复于 2006-11-22 16:51:14 得分 0

学习接分Top

30 楼gapwind()回复于 2006-11-23 14:04:02 得分 0

markTop

31 楼cheqiang(小六子)回复于 2006-11-23 14:48:12 得分 0

可以在CEntityString中的析构函数里面做delete  
   
  这样运行期结束,自动会删除了。  
  Top

32 楼hiox_ppl(ranger)回复于 2006-11-23 15:56:15 得分 0

支持   chenqing1128(Alex)  
   
  C++经常忘记delete,造成内存使用量一直上涨  
  java就没这方面的问题了Top

33 楼sc_0512(angels)回复于 2006-11-23 16:41:35 得分 0

学习Top

34 楼chinatangcy(灵龙)回复于 2006-11-23 17:09:29 得分 0

void   fuc(CEntityString*   temp,1,5)  
  {  
  ......  
  delete   temp;  
  }  
  的方式是不适宜的。  
  一般内存申请和释放,应当遵循谁申请谁释放的原则,在调用函数那里申请的空间,应该交给调用函数去释放,不应该在被调用函数中释放,否则可能会  
  1、使用静态空间,而被释放,发生错误;  
  2、释放不是本身进程或线程或动态链接库空间的内存造成错误;  
  3、不同的程序可能由于编译器的差异比如VC和BCB,在空间存储格式上存在差异,释放其他编译器程序生成的空间可能会造成越界访问或内存泄漏。  
  4、多处使用的空间被某处释放,造成其他被调用函数访问错误;  
  ......  
  危害多多~Top

35 楼knowall_888()回复于 2006-11-23 17:27:58 得分 0

CEntityString*   temp   =   new   CEntityString("abcd");  
  void   fuc(temp,1,5);  
  delete   temp;  
  我认为调整程序结构比从代码本身找问题更实际  
  Top

36 楼zhscnd(无助)回复于 2006-11-23 17:31:11 得分 0

楼上说得对Top

37 楼navyblue1982(这家伙很懒)回复于 2006-11-23 18:10:27 得分 0

void   fuc(new   CEntityString("abcd"),1,5)  
            {  
                  string*   pstr   =   &CEntityString;//保留指针    
                    fuc(pstr,1,5);  
                      delete   pstr;//删除对象    
   
    }  
  Top

38 楼daoguang8()回复于 2006-11-23 18:59:40 得分 0

各位好啊,我是一个学C++的新手。遇到一些情况请大家帮帮忙。我建一个头文件一个主文件,但是编译的时候。它提示错误下面是我的代码。我感觉代码没错,但是它提示Cannot   open   include   file:   'head.h':   No   such   file   or   directory     Error   executing   cl.exe.我也不知道是啥意思请各位大师给指点指点。感激不尽。  
   
  //main()  
  #include   <iostream.h>  
  #include   <head.h>  
  using   namespace   std;  
  main()  
  {int   i,j;  
  cout<<"请输入学号"<<endl;  
  for(i=0;i<3;i++)  
    cin>>student[i].num>>endl;  
  cout<<"请输入姓名"<<endl;  
  for(i=0;i<3;i++)  
    cin>>student[i].name>>endl;  
  cout<<"请输入性别"<<endl;  
  for(i=0;i<3;i++)  
    cin>>student[i].sex>>endl;  
  cout<<"请输入成绩"<<endl;  
  for(i=0;i<3;i++)  
    for(j=0;j<3;j++)  
      cin>>student[i].score[j]>>endl;  
  cout<<"输出学生数据"<<endl;  
  for(i=0;i<3;i++)  
   {cout<<"学号"<<'   \t'<<student[i].num<<endl;  
        cout<<"姓名"<<'   \t'<<student[i].name<<endl;  
        cout<<"性别"<<'   \t'<<student[i].sex<<endl;  
        cout<<"分数"<<'   \t'<<endl;  
        for(j=0;j<3;j++)  
      cout<<student[j].score[j];  
      }  
  }  
   
  //head  
  struct   stu    
  {char   num[3];  
  char   name[8];  
  char   sex;  
  int   score[3];  
  }student[3];  
  Top

39 楼dw14132124()回复于 2006-11-23 19:01:44 得分 0

fuc(new   CEntityString("abcd"),1,5);  
   
   
  如果这样的函数调用,它在这里生成了临时的一个对象.   它分配了对象所须的空间,然后调用了CEntityString类的构造函数,.它一直作用到函数结束,当函数调用完成时,返回时,生成的这个临时的类会自动被释放.  
  在这个时候,会调用析构函数,然后释放空间.所以你不必想怎么去释放生成的这个临时对象.Top

40 楼llgdyxmm()回复于 2006-11-23 21:55:56 得分 0

你的头文件包含格式不对,应该写成  
  #include   <iostream>  
  #include   "head.h"Top

41 楼zenny_chen(ACE Intercessor)回复于 2006-11-23 22:22:46 得分 0

class   EntityString  
  {  
  public:  
   
  EntityString(const   char   *)  
  {  
   
  }  
   
                    ~EntityString(void)   {     }  
  };  
   
   
  void   func(EntityString*   =   new   EntityString("abcd"),   int   =   1,   int   =   5)  
  {  
   
  }  
   
   
  void   main(void)  
  {  
  func();  
  }  
   
  在VS2003.NET下的编译结果:  
   
  在main()函数中:  
   
  func();  
  00411C23     push                 1          
  00411C25     call                 operator   new   (411523h)         //   调用new操作符分配空间  
  00411C2A     add                   esp,4                                           //   将参数1弹出  
  00411C2D     mov                   dword   ptr   [ebp-0D4h],eax    
  00411C33     mov                   dword   ptr   [ebp-4],0    
  00411C3A     cmp                   dword   ptr   [ebp-0D4h],0    
  00411C41     je                     main+6Bh   (411C5Bh)    
  00411C43     push                 offset   string   "abcd"   (4270C8h)    
  00411C48     mov                   ecx,dword   ptr   [ebp-0D4h]    
  00411C4E     call                 EntityString::EntityString   (41100Fh)       //   这里调用构造函数  
  00411C53     mov                   dword   ptr   [ebp-0E8h],eax    
  00411C59     jmp                   main+75h   (411C65h)    
  00411C5B     mov                   dword   ptr   [ebp-0E8h],0    
  00411C65     mov                   eax,dword   ptr   [ebp-0E8h]    
  00411C6B     mov                   dword   ptr   [ebp-0E0h],eax    
  00411C71     mov                   dword   ptr   [ebp-4],0FFFFFFFFh    
  00411C78     push                 5          
  00411C7A     push                 1          
  00411C7C     mov                   ecx,dword   ptr   [ebp-0E0h]    
  00411C82     push                 ecx      
  00411C83     call                 func   (4113A2h)                                     //   调用func函数  
  00411C88     add                   esp,0Ch    
  }  
  00411C8B     xor                   eax,eax    
  00411C8D     mov                   ecx,dword   ptr   [ebp-0Ch]    
  00411C90     mov                   dword   ptr   fs:[0],ecx    
   
  在main()函数中没有调用EntityString的析构函数。  
   
  在func()函数中:  
   
  void   func(EntityString*   =   new   EntityString("abcd"),   int   =   1,   int   =   5)  
  {  
  00411BC0     push                 ebp      
  00411BC1     mov                   ebp,esp    
  00411BC3     sub                   esp,0C0h    
  00411BC9     push                 ebx      
  00411BCA     push                 esi      
  00411BCB     push                 edi      
  00411BCC     lea                   edi,[ebp-0C0h]    
  00411BD2     mov                   ecx,30h    
  00411BD7     mov                   eax,0CCCCCCCCh    
  00411BDC     rep   stos         dword   ptr   [edi]    
   
  }  
   
  没做任何事情。  
  因此内存没被释放。  
  Top

42 楼zenny_chen(ACE Intercessor)回复于 2006-11-23 22:29:09 得分 0

另外,chinatangcy(灵龙)   说得不错。应当注意一下程序设计的思想和逻辑。  
   
  『一般内存申请和释放,应当遵循谁申请谁释放的原则』  
   
  所以,既然楼主提出了问题,我们当然应该尽量去想办法帮他解决。  
   
  上面我提供了可通过编译运行的程序原型,现在利用该原型对本问题进行解决:(很简单)  
  void   main(void)  
  {  
          EntityString   *temp   =   new   EntityString("abcd");  
   
          if(temp   ==   NULL)  
                  return;  
   
          func(temp);  
   
          delete   temp;  
  }Top

43 楼zenny_chen(ACE Intercessor)回复于 2006-11-23 22:30:32 得分 0

上面的例子可以利用显式地传递参数来覆盖掉原本的默认参数。从而得到良好的运行结果。Top

44 楼wskyo(呆呆虫)回复于 2006-11-24 08:45:47 得分 0

强,学习Top

45 楼ikiki(她来听我的演唱会)回复于 2006-11-24 08:50:00 得分 0

楼住的这个函数就像一个劣质的电热水器,好可怕。Top

46 楼Elysium(東鱗覀爫)回复于 2006-11-24 10:02:15 得分 0

头条?Top

47 楼itcsayid()回复于 2006-11-24 10:29:15 得分 0

楼主是想要嵌套么?Top

48 楼malligator(十步之内没有我的爱人)回复于 2006-11-24 10:39:00 得分 0

可以在函数内释放吧Top

49 楼yzcurry(什么都不会)回复于 2006-11-24 10:51:03 得分 0

deleteTop

50 楼liufengping()回复于 2006-11-24 12:07:56 得分 0

这里new出来的空间当然是需要释放的,要不就是内存泄露了,在函数内构造对象是可以的但是你需要在返回这个构造对象的指针,做好记录,然后适当的时候释放掉它,这种方式一般也是用的比较多的,比如在一个系统中,某个对象(CDog)在系统运行到一定状态是往往需要分派出一个副本常常的做法就是如下申明  
   
  CDog*   CDog::Clone()  
  {  
        CDog*   pDog   =   new   CDog;  
   
        //code  
         
        return   pDog;  
  }  
   
  外部释放如下  
  CDog   myDog;  
  CDog*   pCloneDog   =   myDog.Clone();   //创建副本  
  delete   pCloneDog;     //释放副本  
   
   
  如果函数有CDog*形参,就和你的情况是一样的,总之你的函数返回结果应该是new对象的指针  
  CDog*   CDog::Clone(   new   CDog())  
  {  
        //code  
         
        return   pDog;  
  }  
   
   
  Top

51 楼moontornado()回复于 2006-11-24 16:10:17 得分 0

void   fuc(new   CEntityString("abcd"),1,5)  
            {  
   
              }  
  这事应该让bill   gates解决  
  让visual   studio支持这种结构!!!Top

52 楼daiyong_79(口笛)回复于 2006-11-24 16:25:08 得分 0

.......这个new出来的东东怎么调用......匿名的哎.....Top

53 楼Aaron_Jerry(音乐诗人)回复于 2006-11-24 16:29:14 得分 0

当个总结者把.呵呵  
  1.有new必有delete,她俩就像是一对连体双胞胎不可分割.  
  2.作为函数调用的参数,肯定会有一个指针来保存这个动态对象的,或者在函数内delete这个指针,或者在函数外delete   "等价"指针.     注:"等价"指针是指在处理过程中也指向那个动态对象的.  
  3.尽量不要这样写,尤其是在工作过程中.要注意代码的安全性,可读性.Top

54 楼camzhang(猪)回复于 2006-11-24 16:34:58 得分 0

bill   gates也很难解决这个问题,因为对象存在一个生命周期的问题,要编译平台来判断生命周期不可想象,倒是没有研究过JAVA是怎么做的Top

55 楼eplanet([翅膀])回复于 2006-11-24 16:57:29 得分 0

这么写的话,就要配合良好的算法设计了。  
  如果根本无法确认new出来的东东的正确的生存周期。那就想办法记录下指针,然后退出程序的时候一起放掉。  
  也就是同一管理这些空间。Top

56 楼zenny_chen(ACE Intercessor)回复于 2006-11-24 21:09:18 得分 0

其实,对于:  
   
  class   EntityString  
  {  
  public:  
   
  EntityString(const   char   *)  
  {  
   
  }  
   
                    ~EntityString(void)   {     }  
  };  
   
   
  void   func(EntityString*   =   new   EntityString("abcd"),   int   =   1,   int   =   5)  
  {  
   
  }  
   
  最简单的做法是:  
   
  void   main(void)  
  {  
          func(NULL);           //   不用担心内存泄漏了^_^  
  }Top

57 楼rickerliang(专回0分贴(来交流不是为分))回复于 2006-11-24 23:01:40 得分 0

笑死我勒~~~~~Top

58 楼mfktsall()回复于 2006-11-24 23:31:47 得分 0

都是高手~~学习一下!Top

59 楼mfktsall()回复于 2006-11-24 23:47:41 得分 0

新手上路,,在家教下哈,,在哪发问题啊???  
   
   
  Top

60 楼axx1611(long long *&ago)回复于 2006-11-25 00:42:41 得分 0

楼主到底想问什么我还是搞不清楚。不过对于这种写法,并不是一定那么危险和没用,关键是用的人自己得清楚内存到底分配到哪里了,举个例子:  
   
  class   PStrStack  
  {  
  public:  
      PStrStack()   {}  
      virtual   ~PStrStack();  
      void   Push(const   string   &szNew);  
      void   Push(string   *pszNew   =   new   string("abcd"));  
  private:  
      vector<string   *>   m_vecStr;  
  };  
   
  PStrStack::~PStrStack()  
  {  
      vector<string   *>::const_iterator   i   =   m_vecStr.begin();  
      for   (;   i   <   m_vecStr.end();   i++)  
          delete   *i;     //     析构释放string对象空间  
  }  
   
  void   PStrStack::Push(const   string   &szNew)  
  {  
      m_vecStr.push_back(new   string(szNew));   //   此时string对象空间是由PStrStack分配的  
  }  
   
  void   PStrStack::Push(string   *pszNew)  
  {  
      m_vecStr.push_back(pszNew);   //   string对象空间由外部分配  
  }  
   
  int   main()  
  {  
        PStrStack   *p   =   new   PStrStack;  
        p->Push("1234");  
        p->Push();  
        string   *pStr   =   new   string("try");  
        p->Push(pStr);     //   pStr的内存移交给p所指PStrStack对象管理  
        pStr   =   NULL;         //   避免意外情况,可以先将这个指针置空(根据需要决定)  
        p->Push(new   string("xyz"));  
        delete   p;  
        return   0;  
  }  
   
  绝不能  
  string   *pStr   =   new   string("string");  
  p->Push(pStr);  
  ...  
  delete   pStr;  
  delete   p;  
  这样pStr的空间等于是被delete了两次。。。  
   
  Top

61 楼happyCore()回复于 2006-11-25 11:37:33 得分 0

楼上的。。真是不知道楼主在说什么哇。。Top

62 楼cradmin()回复于 2006-11-25 13:03:49 得分 0

to   dw14132124()  
  ______________________________  
  fuc(new   CEntityString("abcd"),1,5);  
   
  如果这样的函数调用,它在这里生成了临时的一个对象.   它分配了对象所须的空间,然后调用了CEntityString类的构造函数,.它一直作用到函数结束,当函数调用完成时,返回时,生成的这个临时的类会自动被释放.  
  在这个时候,会调用析构函数,然后释放空间.所以你不必想怎么去释放生成的这个临时对象.  
  ——————————————————————————————————————————  
  我试了一下,由new生成得对象在其生命周期结束时并没有自动调用对象的析构函数,另外即使在显式调用比如CEntityString的析构函数后,由new申请的那块内存也没有什么变化(应该内存没释放),只有调用delete后那块内存发生了变化(在vc里面看了一下那个地址的内存,改了几个字节,不知道干什了什么),同时还调用了对象CEntityString的析构函数,new和delete应该是成对使用的  
   
  想问一下大家,delete时到底做了些什么?  
   
  另外   to   zenny_chen(ACE   Intercessor):  
  void   func(EntityString*   =   new   EntityString("abcd"),   int   =   1,   int   =   5)  
  {  
   
  }Top

63 楼cradmin()回复于 2006-11-25 13:04:30 得分 0

不好意思,上面没说完  
  void   main(void)  
  {  
  func();  
  }  
  想问一下,像这种调用是main函数还是func函数负责调用new来生成的对象,这两者有什么区别吗(是不是在那释放都一样)  
   
  我也是新手,不对的地方大家指点!Top

64 楼jiajiaedu(两会)回复于 2006-11-25 15:44:14 得分 0

编译没通过.Top

65 楼wqf363(denny)回复于 2006-11-25 17:03:14 得分 0

new出来的都保存在进程的全局堆里,只有自己delete或者给别的对象delete,一定要delete,否则肯定内存leakTop

66 楼zhaolei254()回复于 2006-11-25 22:45:03 得分 0

长见识了!我正在学c++     学了相当多的东西Top

67 楼zenny_chen(ACE Intercessor)回复于 2006-11-25 22:50:38 得分 0

To   cradmin()   :  
   
  两者并没有本质上的区别。new操作返回的是动态分配的存储片的首地址,因此在delete时也要用它作为参数。你也可以将new所返回的地址视为memory   handleTop

68 楼shendl(良少)回复于 2006-11-26 00:25:02 得分 0

void   fuc(new   CEntityString("abcd"),1,5)  
            {  
   
              }  
  ===================================================================  
          这个函数写得不对。     第一个参数,应该是一个指针,或者对象引用。  
  new   CEntityString("abcd")应该在调用代码中使用。   再在调用代码中释放。不应该在函数中释   放外部生成的对象。否则必然出现错误!  
        void   fuc(CEntityString*   temp,1,5)  
        {  
            ......  
              delete   temp;//此句可以释放内存,避免产生内存泄漏  
          }  
        上面这种写法,也是绝对错误的!   会释放已经释放的对象,造成错误!  
  Top

69 楼arrowcy(长弓手)回复于 2006-11-26 00:48:16 得分 0

我怎么记得在某个地方见到过这种用法,好像是msdn?反正我也就的这种用法有问题,一直没这么用。Top

70 楼keily()回复于 2006-11-26 16:42:28 得分 0

真郁闷!~Top

71 楼xu_yuanjie()回复于 2006-11-26 18:14:59 得分 0

怎么能这样写呢,到时候谁来释放呢?Top

72 楼missilery(导弹专家)回复于 2006-11-26 20:47:41 得分 0

void   fuc(new   CEntityString("abcd"),1,5)  
            {  
   
              }  
  这个就不叫做函数了吧  
   
  估计可以这样  
  void   fuc(CEntityString   *   s   =   new   CEntityString("abcd"),int   b=1,float   c=2)  
  {  
          delete   s;  
  }Top

相关问题

关键词

得分解答快速导航

  • 帖主:yangbc

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo