c++ new长度为0的数组

在程序中发现一下代码:

int CHmcVideoMgt ::OnGetDiskRunningInfo( SOCKETPARAM *pSocketInfo ,Json:: Value Param )
{
        int iArrayLen = Param[ _T("NUM" )].asInt();
         .....
        LPDiskRunningInfo  pDiskRunningInfo = new DiskRunningInfo[iArrayLen ];
        int nResult = HMCBLL_GetDiskRunningInfo(pDiskRunningInfo ,iArrayLen);

             SAFE_DELETE_POINTER_ARRAY (pDiskRunningInfo);
        return E_SUCCEED ;
}

 

代码中没有判断 iArrayLen 的值为0的情况, 如果iArrayLen =0,  

LPDiskRunningInfo   pDiskRunningInfo = new DiskRunningInfo [iArrayLen ]

执行成功, 而且指针也可以正常的赋值和操作. 

但是在删除的时候弹出堆栈异常, 提示"其原因可能是堆被损坏".

 

c++是不允许定义长度为0的数组的, 如果定义 char sz[0]; 编译器报错: error C2233: “Target of operator new()” : 包含大小为零的数组的对象数组是非法的.

 

但是在new一个长度为0数组时,编译不报错,   也返回一个正常的指针地址,  但是实际没有分配内存,  当修改数据时就会导致内存被破坏. 当被破坏的内存恰好被使用时就会导致异常.

时间: 2024-12-10 07:21:57

c++ new长度为0的数组的相关文章

【C语言】关于结构体最后的长度为0或1数组的思考

需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.但最新的C/C++不知道是否可以,我没有测试过.(C99允许.微软的VS系列报一个WARNING,即非常的标准扩展.) 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申

结构体中的柔性数组成员(数组长度为0成员)!

其实很早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们的分享,这是我前进的动力!同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.但最新的C/C++不知道是

c++-C++,如何将未知长度的string输入数组

问题描述 C++,如何将未知长度的string输入数组 如代码,我发现程序在运行时会跳过cin.get,这是怎么回事啊?另外,关于将未知长度的字符串输入数组,还有什么好办法吗? int main() { int time; scanf("%d", &time); int count=0; while(count < time) { string str; char temp; int i; while((temp=cin.get())!='n') { str +=temp

求助C# 把一个长度为1026×512的byte型数组 拆分为512个长度为1026的数组

问题描述 求助C#把一个长度为1026×512的byte型数组拆分为512个长度为1026的数组其中1026长度的最后两个1025和1026为顺序标记位(我已经设置好的)再按照顺序标记,重新组成个长度为1024×512的一个数组(这里的1024是把每个1026最后两个顺序位置删除) 解决方案 解决方案二:贵求大神啊---刚开始搞C#不是很会啊解决方案三:顺序标记就是从0数到511啊解决方案四:for(i=0;i<512;i++){byte[]b=newbyte[1026];for(j=i*102

.NET 4.0中数组的新增功能

1.两数组是否"相等"? 在实际开发中,有时我们需要比对两个数组是否拥有一致的元素,例如,以下两个数组由于拥有相同的元素,因此被认为是相等的: int[] arr1 = new int[] { 1,2,3,4 }; int[] arr2 = new int[] { 1,2,3,4 }; 在.NET早期版本中,要实现上述数组比对功能,必须自己动手编写一个函数,在其内部使用循环语句逐个比较两个数组的对应元素,才知道这两个数组是否相等. 在.NET 4.0中,数组基类Array实现了一个新增

艾伟_转载:.NET 4.0中数组的新增功能

1.两数组是否"相等"? 在实际开发中,有时我们需要比对两个数组是否拥有一致的元素,例如,以下两个数组由于拥有相同的元素,因此被认为是相等的: int[] arr1 = new int[]{1,2,3,4};int[] arr2 = new int[]{1,2,3,4}; 在.NET早期版本中,要实现上述数组比对功能,必须自己动手编写一个函数,在其内部使用循环语句逐个比较两个数组的对应元素,才知道这两个数组是否相等. 在.NET 4.0中,数组基类Array实现了一个新增的接口IStr

视频-c#的windows media player控件为什么获取当前进度和总长度总是0?

问题描述 c#的windows media player控件为什么获取当前进度和总长度总是0? string str1 = axWindowsMediaPlayer1.Ctlcontrols.currentPosition.ToString(); string str2 = axWindowsMediaPlayer1.currentMedia.duration.ToString(); 我是在button1的click事件里写的,button1是打开视频的按钮,结果是"0",为什么?视频

c++-C++ 6.0读入数组,数组的大小没办法确定

问题描述 C++ 6.0读入数组,数组的大小没办法确定 C++ 6.0读入数组,数组的大小没办法确定,所以希望数组不足的时候对它扩容,是使用memcpy么?但是效率会不会低呢? 解决方案 使用stl中的vector,直接push_back进去 解决方案二: 直接用vector就好啦 解决方案三: 为什么数组的大小不能确定?数组大小在定义时就已经确定了啊.不能确定的是动态数组吧

C++ 6.0浮点数组通过多线程计算秘制函数和均方差

问题描述 C++ 6.0浮点数组通过多线程计算秘制函数和均方差 C++ 6.0浮点数组通过多线程计算秘制函数和均方差,用多线程并发优化,属于密集程序么?怎么样才能CPU密集化? 解决方案 http://blog.csdn.net/zhandoushi1982/article/details/6041430