免费注册 查看新帖 |

Chinaunix

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

关于operator new[]和delete[]内置类型的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-15 22:31 |只看该作者 |倒序浏览
首先谢谢你打开这个帖子哈
恩,我的意思是,当动态分配内置类型数组的时候,为什么分配正好的内存呢,这样,delete[]的时候怎么识别是否到了数组尾阿?
如这个小程序,
  1. void* operator new[](size_t w{
  2. void *p=::operator new(w);
  3.         cout<<"w:"<<w<<endl
  4.                 <<p<<endl;//用来输出new表达式所要求的字节数
  5.         return p;
  6. }
  7. int main()
  8. {
  9.         int *p2=new int[5];
  10.         cout<<"p2:"<<p2<<endl;
  11.         cout<<endl;
  12.         delete[] p2;
  13.         return 0;
  14. }
复制代码
显示输出20,即4*5=20,即使我delete p2;也不会报错,请问为什么会这样呢?

论坛徽章:
0
2 [报告]
发表于 2012-06-15 23:42 |只看该作者
回复 1# Beginnor
数组内存对象中会保存“数组大小”信息,这依赖于编译器实现,因此使用delete[]时,会知道应该使用多少次析构函数

int *p2=new int[5];
delete p2;      
结果是未定义行为,极有可能发生内存泄漏

   

论坛徽章:
0
3 [报告]
发表于 2012-06-16 22:20 |只看该作者

    谢谢您的回答!
不过在分配一个自定义的类的数组时候,的确是有一个表示数组大小的信息,如这个程序:
  1. #include<iostream>
  2.   
  3. using std::cout;

  4. using std::endl;

  5. using std::hex;

  6. class X

  7. {

  8.         public:

  9.                 X(int q = 0): a(q) {}

  10.                 ~X() { cout << "del" << endl; }

  11.         private:

  12.                 int a;

  13. };


  14. void *operator new[](size_t size)

  15. {

  16.         void *p = malloc(size);

  17.         cout << "new[]:" << size << endl;

  18.         cout << "new[]:" << hex << p << endl;

  19.         return p;

  20. }


  21. int main(void)

  22. {

  23.         X *q = new X[5];

  24.         cout << hex << q << endl;

  25.         cout << *(reinterpret_cast<int *>(q) - 1) << endl;

  26.         delete [] q;

  27.         q = new X(3);

  28.         cout << hex << q << endl;

  29.         delete q;


  30.         return 0;

  31. }
复制代码
可以看出有4字节用来表示,但内置类型的数组没有这几个专门的字节阿~请问这是怎么回事啊……

ps:程序引自
关于operator new和operator new[]的区别
http://bbs.chinaunix.net/forum.p ... mp;fromuid=27068386

论坛徽章:
0
4 [报告]
发表于 2012-06-16 22:27 |只看该作者
不用析构的类型管他有多少个呢

论坛徽章:
0
5 [报告]
发表于 2012-06-16 22:33 |只看该作者
回复 4# sonicling

……对,不过小弟纳闷的是,我delete[]的时候编译器咋就能分出来数组到哪结束阿


   

论坛徽章:
0
6 [报告]
发表于 2012-06-16 23:30 |只看该作者
回复 5# Beginnor


    只有析构的时候才会关心数量,删除内存时的内存长度记录在内存管理器里。

论坛徽章:
0
7 [报告]
发表于 2012-06-17 22:31 |只看该作者
回复 6# sonicling


    谢谢您的回答哇哇
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP