可以在动态分配的内存上调用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,避免这种情况。

链接地址: http://www.djcxy.com/p/82329.html

上一篇: Can calling memset on a dynamically allocated memory cause heap corruption

下一篇: What can explain heap corruption on a call to free()?