同意
 回复人: jaidy(骑士) (  ) 信誉:97  2002-06-05 12:00:00  得分:0  
 
 
  delete pObject!
  
 

解决方案 »

  1.   

    那是不是说 delete p;没有把内存中的对象释放掉,那它释放了什么呢?如果改为:
          
          delete (ClassA *)p;结果有如何呢?
      

  2.   

    当然不相等。      delete (ClassA *)p 等同于   delete pObject
      

  3.   

    一样的,因为你传的是地址,分配的内存只有一块,地址一样了删除的东东也一样
    你删除后最好q=NULL;你对指针的概念不清楚,好好琢磨一下指针的概念
      

  4.   

    一样的,都是分配内存,删除后应该像楼上说得那样,加上q=NULL;原因是
    告诉系统内存清除,q重新指向空指针
      

  5.   

    好好看书吧delete 不仅删除分配的内存还包括对所指对象的解构.
    否则free 就可以了.先把new/delete 和 malloc/free 搞清楚
      

  6.   

    当然不一样。delete是根据类型确定要删除的大小的。
      

  7.   

    哦,谢谢各位,我要做个实验,看看在delete p时是否调用了类的析构函数。我给你们加分啦。
      

  8.   

    不一样:
    其实delete在编译时已经根据不同的类型生成不同的代码。
      对于void* delete会简单释放内存.
      对于ClassA delete还会做一些其它善后处理。可以试验一下(完整的程序):#include <stdio.h>class ClassA
    {
    public:
      int a;
      int *p;  ClassA()
      {
        p = new int[4];
      }  ~ClassA()
      {
        delete [] p;    printf("Go over here!");
        getchar();
      }
    };void main()
    {
      ClassA* pA = new ClassA;
      void* pV = pA;  delete pV;//再换成delete pA试试,结果全然不同
    }
      

  9.   

    #include <conio.h>
    #include <stdio.h>
    #include <iostream.h>
    #include <string.h>
    #include <windows.h>class ClassA
    {
    public:
    int x[20];
    };void main()
    {
    ClassA * pObject;
    LPVOID p;

    pObject = new ClassA[3];
    cout<<pObject<<endl;
    p = pObject;
    delete [](int *)p;
    pObject = new ClassA[3];
    cout<<pObject<<endl;
    delete [] pObject;
    }我的观点:
    两者效果是一样的,对于delete 操作,我们只要给它一个地址,那么编译器就会很聪明地Free掉你想要Free的内存空间,不错,正像lemon_zc1949(lemon) 所讲的一样:"p中只是保存这地址啊,但不知道内存中的块的大小啊"我当初也存在这样的疑问。
    一位网友这样给我解释:你用New分配时,编译会自动用一个字节来记录你这次分配内存的情况,比如:长度等,所以当你用Delete删除时,编译会依据那一个字节的记录信息来智能化地Free内存,这样我们只需要提供一个地址即可而它的类型我们不必关心。
    所以我认为:
    ClassA * pA = new ClassA;
    LPVOID p = pA;
    delete pA; and delete p; and delete (ClassA *)p; and delete (int *)p;
    是一样的。
      

  10.   

    另外delete删除大小的问题,其实不存在。因为C++的内存管理库对任何一片内存空间的大小都会记得,但实现方法不尽相同
      

  11.   

    哦对了,我试了,Qindq你说的不错。delete pV不调用析构函数,而delete pA要调用,不过我又试了下面代码它也会调用析构函数,:)delete (ClassA *)pV;问题解决了,给分了。
      

  12.   

    To lemon_zc1949(lemon) :
    原来你不知道"delete pV不调用析构函数,而delete pA要调用"????
    delete (ClassA *)pV;
    会调用,那当然了!
      

  13.   

    delete与析构函数,new与构造函数——是什么样的关系呢?
    准确的说,不是delete自动调用了析构函数,对析构函数的调用语句是在编译时由编译器根据具体的指针类型自动加到delete语句之前的。这是一个很大的误区。