我们有一个类来代表一个非常大的应用程序中的列表:
CSMLNode
{
CSMLNode *pChild;
CSMLNode *pSibling;
CSMLNode()
{
pChild = NULL;
pSibling = NULL;
}
}
为了优化,创建的节点对象保存在池中,并在应用程序的生命周期内重用。仅当节点对象的数量超过特定计数时才释放节点对象。将节点对象释放到池中或从池中取出时,pChild
和pSibling
的值不会设置为NULL。我们认为这会在应用程序中造成崩溃。
我计划将pChild和pSibling的值设置为0xDDDDDDDD
,如果从池中获取节点对象时其值不为NULL。当我从池中获取节点对象后,访问pChild
或pSibling
指针而没有设置适当的对象指针pChild
和pSibling
时,我强烈要求强制崩溃应用程序。
这会像我期待的那样起作用吗?如果没有,我应该为强制访问违规提供什么指针值。
我已启用整页堆,以尽早获取访问冲突。
答案 0 :(得分:4)
Visual Studio调试CRT已经这样做了。从堆分配的内存初始化为0xcdcdcdcd。由于您的struct包含指针,因此取消引用未初始化的指针将自动生成AV。调试堆初始化值为documented here。
你没有必要帮忙。避免保留自己的池,CRT已经在Windows低碎片堆的充分帮助下做得很好。如果你想保留它,那么我建议你使用与调试CRT相同的方法。不要忽略它所做的一切,无人区域是早期检测内存损坏的绝佳方法。
答案 1 :(得分:0)
它会调用未定义的行为,这可能会也可能不会使您的应用程序崩溃。它也可能做其他不需要的事情。
即使仅将值0xDDDDDDDD
存储为指针(不对其进行反省)也是未定义的行为。