遇到一个delete的问题,不知道应如何解释:
char* p=new char[1000];
delete p;
会删除p所指向的内存么?P-1都泄露了,还是全部都泄露了?delete reinterpret_cast<int*>(p),会删除4个字节的内存还是怎么样?int* t=reinterpret_cast<int*>(p);
delete t;为啥会报错?

解决方案 »

  1.   

    第三个问题问错了,int* t=reinterpret_cast<int*>(p);
    delete t;好使,问题原来是这样的:
    int* m;int* t=reinterpret_cast<int*>(p);
    m=t;
    delete m;出错;
      

  2.   

    还是不对,总结起来吧,用X类型分配的内存,能不能用X强转之后的T指针删除?
      

  3.   


    你问 能不能 ? 
    答:能。再答:最好不要。
    比如 char* c = new char('a');
    int* p = (int*)c;
    delete p; 此处是删除p所指的地址开始的4个字节,而事实上,只有1个字节。
      

  4.   

    char* p=new char[1000];
    delete p;
    会删除p所指向的内存么?P-1都泄露了,还是全部都泄露了?
    ---------------------
    没有泄露,如果不好理解,结合malloc和free想这个问题,free的时候并没有指令要free的大小,实际上,CRT分配的时候你这个指针对应的空间大小已经记录下来了,释放的时候只需要提供指针即可delete [] 比delete会依次对每个元素调用析构,而delete认为只有一个元素,只调用一次析构
    对基本类型来说,没有析构函数,但对类来说delete []和delete就完全不一样了总之使用者来说,按规矩办事就好,没必要去冒险
      

  5.   

    多谢指导!再请问一下,CRT为每个内存提供的追踪是操作系统维护的,还是应用程序维护的?
      

  6.   

    多谢前辈帮助,我还是把源代码发上来,问题可见:
    template <typename T>
    CMemoryPool<T>::CMemoryPool(size_t linkNumber,size_t linkSize)
    {
    m_linkNumber = linkNumber>=m_eDefaultLinkNumber?linkNumber:m_eDefaultLinkNumber;
    m_linkSize = linkSize>=m_eDefaultLinkSize?linkSize:m_eDefaultLinkSize;
    m_nOffset = sizeof(next)+sizeof(last); //真正对象在这两个变量之后 CMemoryPool<T>* runner=reinterpret_cast<CMemoryPool<T>*>(new char[m_linkSize]); head=end=runner; for(size_t n=1;n<linkNumber;n++)
    {
    runner->next=reinterpret_cast<CMemoryPool<T>*>(new char[m_linkSize]);
    runner->next->last=runner;
    runner=runner->next;
    }
    runner->next=head;
    head->last=runner;
    }template <typename T>
    CMemoryPool<T>::~CMemoryPool()
    {
    CMemoryPool<T>* runner=head;

    for(size_t n=0;n<m_linkNumber;)
    {
    cout<<n<<endl;
    runner=head->next;

    delete head; //...

    head=runner;
    n++;
    }
    }这个delete,每次都使循环直接跳转到下一次,跟continue似的,不知道为什么。。
      

  7.   

    int * a  = new int [100];
    delete [] a;char * pc = new char [100];
    delete pc;char类型是个特例