溯流而上 2018-04-13 04:02 采纳率: 50%
浏览 3813
已采纳

有点疑惑,c++中int*p=new int[0]动态分配了多大的内存,求不吝赐教

 int main()
{
    int *ptr=new int[0];
    ptr[0]=1;
    ptr[1]=2;
    cout<<"ptr[0]:"<<ptr[0]<<endl;
    cout<<"ptr[1]:"<<ptr[1]<<endl;
    for(int i=0;i<6;i++)
    {
        ptr[i]=i+1;

    }
    for(int i=0;i<6;i++)
    {
        cout<<ptr[i]<<"\t";

    }
    cout<<endl;
    system("pause");
    return 0;
}

访问ptr[6]程序会中断,疑惑new int[0]分配了多大的空间,在什么情况下会访问越界,在vs2013下编译的

  • 写回答

9条回答 默认 最新

  • tang_cheng 2018-04-13 07:22
    关注

    new分配的时候,一般会分配除了它本身大小以外的内存头和内存尾,一般形式为:[内存头][可用数据][内存尾]。
    而你的ptr指针返回的是[可用数据]部分的起始地址。大部分编译器在用户分配的size为0的情况下,会自动分配1字节的可用内存,
    以保证返回的ptr是一个合法的指针。但是,C/C++是一个从来都不校验内存溢出的语言。因此,你可以访问任意从ptr开始的地址的数据,
    如果你访问的地址正巧有数据,则这个数据就会被访问到,如果正好这个地址没分配数据,才会抛出异常。但是如果你在ptr指向的任意地址
    中写了数据,且地址已经超过了可用数据的范围,则会有两种情况发生:如果该地址没有分配数据,则你很幸运,系统会直接抛出异常。
    如果该地址有数据(比如内存尾或其他分配的数据),则会让你写入,并不报任何错误,但是在程序运行到需要读取你写的数据部分时候会发生
    你所以为的莫名其妙的错误。这时候要去排查错误,那可真是想死的心都有了。这也是C/C++中最难控制的部分。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝