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时)。能否提供一个小的完整(编译)示例来重现此错误?