C++ C++;删除对象数组时发生堆异常
我有以下代码:C++ C++;删除对象数组时发生堆异常,c++,arrays,exception,object,heap,C++,Arrays,Exception,Object,Heap,我有以下代码: class Vards { public: char vards[31]; //some functions here// }; Vards *Arr; Arr = new Vards[word_count];//dynamically allocates //do some stuff delete[] Arr; 一切似乎都很好,但在最后一行VS给了我一个例外,并中断到一些奇怪的地方,如: extern "C" _CRTIMP int __c
class Vards
{
public:
char vards[31];
//some functions here//
};
Vards *Arr;
Arr = new Vards[word_count];//dynamically allocates
//do some stuff
delete[] Arr;
一切似乎都很好,但在最后一行VS给了我一个例外,并中断到一些奇怪的地方,如:
extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
const void * pUserData
)
{
if (!pUserData)
return FALSE;
if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
return FALSE;
return HeapValidate( _crtheap, 0, pHdr(pUserData) );
}
然后去
void __cdecl _free_base (void * pBlock)
{
int retval = 0;
if (pBlock == NULL)
return;
RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
retval = HeapFree(_crtheap, 0, pBlock);
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
}
}
这应该是正常的吗?我的代码块甚至不能运行这个程序(尽管它编译了它),所以我想知道我是否做错了什么。
我无法在谷歌上搜索任何与此相关的内容。对象数组是否存在某种限制,或者我是否做错了什么
[编辑]根据Matts和barak manos的建议,我彻底检查了整个代码,发现我确实在某个特定位置访问了索引过大的数组。
能否请你们中的一位发表评论作为答案,这样我就可以标记这个答案
附加问题:如果我在删除a)之前对堆造成了一些伤害,为什么它没有立即找到它?b) 删除时它是如何找到的?正如其他人所评论的,您可能在某个地方损坏了堆。(对此发表评论的人应该给出答案,这样他们就可以获得荣誉。) 关于您的奖金问题: 当您写入数组的元素(为了速度)时,不检查索引是否在C和C++中的界限内。(当然,如果您试图写入不属于您的内存,则会出现分段错误。)
在从new[]获取内存之前和之后,会分配几个特殊格式的字节用于记账。使用delete[]时,将检查这些字节的有效性以检测损坏的堆。如果我没有弄错的话,它是否工作以及如何工作取决于您的平台和编译器 您可能在代码的其他地方有堆损坏(例如,动态分配的缓冲区溢出)。可能是因为它只在这一行发现堆损坏了吗?我正在逐行检查代码,只有在删除时才会抛出异常。您没有尝试使用大于
单词计数-1的索引访问Arr
。2.您没有试图访问索引大于30的vards
(包括mem-copy操作和str
操作,当vards
中的31个字符都不等于0时)。能否提供一个小的完整(编译)示例来重现此错误?