我们有一个类来表示一个非常大的应用程序中的列表:
CSMLNode
{
CSMLNode *pChild;
CSMLNode *pSibling;
CSMLNode()
{
pChild = NULL;
pSibling = NULL;
}
}为了进行优化,创建的节点对象保存在一个池中,并在应用程序的整个生命周期中重用。仅当节点对象的数量超过特定计数时,才释放节点对象。当节点对象释放到池中或从池中取出时,pChild和pSibling的值不会设置为NULL。我们怀疑这会在应用程序中造成崩溃。
我计划将pChild和pSibling的值设置为0xDDDDDDDD,如果从池中获取节点对象时它的值不为NULL。我的意图是在从池中获取节点对象后,在没有设置指向pChild和pSibling的适当对象指针的情况下访问pChild或pSibling指针时,会强制使应用程序崩溃。
这会像我期望的那样工作吗?如果没有,我应该为强制访问冲突提供什么指针值。
我已经启用了全页堆,以便尽可能早地获取访问冲突。
发布于 2012-04-14 15:59:28
Visual Studio调试CRT已经做到了这一点。从堆中分配的内存将初始化为0xcdcdcdcd。因为你的struct包含指针,所以取消引用未初始化的指针将自动生成AV。调试堆初始化值为documented here。
你不需要帮忙。避免保留自己的池,在Windows低碎片堆的充分帮助下,CRT已经做得很好了。如果您想保留它,那么我建议您使用与debug CRT相同的方法。不要跳过它所做的其他事情,无人区是及早发现内存损坏的绝佳方法。
发布于 2012-04-14 15:14:38
它调用未定义的行为,这可能会也可能不会使您的应用程序崩溃。它还可能做其他不受欢迎的事情。
即使只是将值0xDDDDDDDD存储为指针(而不去引用它)也是未定义的行为。
https://stackoverflow.com/questions/10151782
复制相似问题