问一个关于delete的问题

Ians_Huyu 2013-02-02 03:24:36
遇到一个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;为啥会报错?
...全文
329 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ians_Huyu 2013-02-18
  • 打赏
  • 举报
回复
析构函数重入了,擦
vcorange 2013-02-06
  • 打赏
  • 举报
回复
int * a = new int [100]; delete [] a; char * pc = new char [100]; delete pc; char类型是个特例
jimette 2013-02-02
  • 打赏
  • 举报
回复
关键是lz强制转换会通过编译么

编译通过取值会正常么?
Ians_Huyu 2013-02-02
  • 打赏
  • 举报
回复
是不是构造函数重入了?
Ians_Huyu 2013-02-02
  • 打赏
  • 举报
回复
引用 3 楼 zhoujielunzhimi 的回复:
引用 2 楼 IT_xhe 的回复:还是不对,总结起来吧,用X类型分配的内存,能不能用X强转之后的T指针删除? 你问 能不能 ? 答:能。 再答:最好不要。 比如 char* c = new char('a'); int* p = (int*)c; delete p; 此处是删除p所指的地址开始的4个字节,而事实上,只有1个字节。
多谢前辈帮助,我还是把源代码发上来,问题可见: 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似的,不知道为什么。。
Ians_Huyu 2013-02-02
  • 打赏
  • 举报
回复
引用 4 楼 wocow3 的回复:
char* p=new char[1000]; delete p; 会删除p所指向的内存么?P-1都泄露了,还是全部都泄露了? --------------------- 没有泄露,如果不好理解,结合malloc和free想这个问题,free的时候并没有指令要free的大小,实际上,CRT分配的时候你这个指针对应的空间大小已经记录下来了,释放的时候只需要提供指针即……
多谢指导!再请问一下,CRT为每个内存提供的追踪是操作系统维护的,还是应用程序维护的?
wocow3 2013-02-02
  • 打赏
  • 举报
回复
char* p=new char[1000]; delete p; 会删除p所指向的内存么?P-1都泄露了,还是全部都泄露了? --------------------- 没有泄露,如果不好理解,结合malloc和free想这个问题,free的时候并没有指令要free的大小,实际上,CRT分配的时候你这个指针对应的空间大小已经记录下来了,释放的时候只需要提供指针即可 delete [] 比delete会依次对每个元素调用析构,而delete认为只有一个元素,只调用一次析构 对基本类型来说,没有析构函数,但对类来说delete []和delete就完全不一样了 总之使用者来说,按规矩办事就好,没必要去冒险
sumos 2013-02-02
  • 打赏
  • 举报
回复
引用 2 楼 IT_xhe 的回复:
还是不对,总结起来吧,用X类型分配的内存,能不能用X强转之后的T指针删除?
你问 能不能 ? 答:能。 再答:最好不要。 比如 char* c = new char('a'); int* p = (int*)c; delete p; 此处是删除p所指的地址开始的4个字节,而事实上,只有1个字节。
Ians_Huyu 2013-02-02
  • 打赏
  • 举报
回复
还是不对,总结起来吧,用X类型分配的内存,能不能用X强转之后的T指针删除?
Ians_Huyu 2013-02-02
  • 打赏
  • 举报
回复
第三个问题问错了,int* t=reinterpret_cast<int*>(p); delete t;好使,问题原来是这样的: int* m;int* t=reinterpret_cast<int*>(p); m=t; delete m;出错;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧