我有这段代码:
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)删除后如何找到它?
答案 0 :(得分:1)
正如其他人所评论的那样,你可能正在某处破坏堆。 (评论此内容的人应该将其作为答案,以便他们可以获得奖励。)
关于您的红利问题: 当你写一个数组的元素(为了速度)时,没有检查索引是否在C和C ++的边界内。 (当然,如果您尝试写入不属于您的内存,则会出现分段错误。)
在从new []获取的内存之前和之后,为记账分配了几个特殊格式的字节。使用delete []时,将检查这些字节的有效性以检测损坏的堆。如果我没有弄错,是否以及如何工作取决于您的平台和编译器。