删除对象数组时的C ++堆异常

时间:2014-05-11 09:53:03

标签: 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 __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());
        }
}

这应该是正常的吗?我的CodeBlocks甚至无法运行程序(虽然它编译它)所以我很想知道是否有什么我做错了。 我不能谷歌任何与此有关的东西。对象数组是否有某种限制,或者我做错了什么?

[编辑]根据Matts和barak manos的建议,我彻底检查了整个代码,发现我确实在一个特定的地方使用过大的索引来访问数组。 可以请你们中的一个发表你的评论作为答案,这样我可以标记这个答案吗?

奖金问题:如果我在删除之前对堆造成了一些损坏a)为什么不立即找到它? b)删除后如何找到它?

1 个答案:

答案 0 :(得分:1)

正如其他人所评论的那样,你可能正在某处破坏堆。 (评论此内容的人应该将其作为答案,以便他们可以获得奖励。)

关于您的红利问题: 当你写一个数组的元素(为了速度)时,没有检查索引是否在C和C ++的边界内。 (当然,如果您尝试写入不属于您的内存,则会出现分段错误。)

在从new []获取的内存之前和之后,为记账分配了几个特殊格式的字节。使用delete []时,将检查这些字节的有效性以检测损坏的堆。如果我没有弄错,是否以及如何工作取决于您的平台和编译器。