可以在动态分配的内存上调用memset会导致堆损坏
在真正的项目中调试分段错误时,在长时间运行后发生崩溃并且随机测试不容易重现。 崩溃点显示在写入类似的函数中崩溃
void deallocateObject( objectType* ptr)
{
ASSERT(ptr);
if(!ptr)
return;
if(ptr->customDeallocator)
ptr->customDeallocator->deallocate();
else
free(ptr);
}
项目中使用了各种分配器和释放器。 为了验证分段错误不是因为分配的内存在释放后没有被设置为NULL,我在这个函数中的最后一个语句之后向memset添加了一个调用。
memset(ptr, 0, sizeof(objectType));
但是在这个改变之后,我开始每次都发出崩溃消息,说堆已损坏。
所以我的问题是如何以及在什么情况下调用memset()会导致堆损坏。
所以我的问题是如何以及在什么情况下调用memset()会导致堆损坏。
任何时候使用它来修改可能用于跟踪堆内部结构的内存。 例如,您刚刚告诉堆分配器的内存已经完成,并且现在可以自由用于任何目的,例如跟踪堆的内部结构。
只验证分段错误不是因为释放后分配的内存未设置为NULL
那么,这不是你如何调试动态分配内存相关的问题。 就进一步释放而言,包含NULL
的指针与已经传递给free()
内存的指针一样无效。
因此,是否已将free()
d指针(手动)设置为NULL
,该指针的进一步使用(取消引用)会导致未定义的行为,您可能会也可能不会得到分段错误,因为肯定的是,它只是一个有UB的许多副作用。
您需要使用内存调试器,比如valgrind来捕获并解决问题。
FWIW,任何使用无效内存的尝试(包括NULL
,是)调用UB,避免这种情况。
上一篇: Can calling memset on a dynamically allocated memory cause heap corruption