无效指针强制崩溃应用程序

时间:2012-04-14 07:12:14

标签: c++ visual-studio-2008

我们有一个类来代表一个非常大的应用程序中的列表:

CSMLNode
{
   CSMLNode *pChild;
   CSMLNode *pSibling;  

   CSMLNode()
   {
     pChild = NULL;
     pSibling = NULL;
   }         
}

为了优化,创建的节点对象保存在池中,并在应用程序的生命周期内重用。仅当节点对象的数量超过特定计数时才释放节点对象。将节点对象释放到池中或从池中取出时,pChildpSibling的值不会设置为NULL。我们认为这会在应用程序中造成崩溃。

我计划将pChild和pSibling的值设置为0xDDDDDDDD,如果从池中获取节点对象时其值不为NULL。当我从池中获取节点对象后,访问pChildpSibling指针而没有设置适当的对象指针pChildpSibling时,我强烈要求强制崩溃应用程序。

这会像我期待的那样起作用吗?如果没有,我应该为强制访问违规提供什么指针值。

我已启用整页堆,以尽早获取访问冲突。

2 个答案:

答案 0 :(得分:4)

Visual Studio调试CRT已经这样做了。从堆分配的内存初始化为0xcdcdcdcd。由于您的struct包含指针,因此取消引用未初始化的指针将自动生成AV。调试堆初始化值为documented here

你没有必要帮忙。避免保留自己的池,CRT已经在Windows低碎片堆的充分帮助下做得很好。如果你想保留它,那么我建议你使用与调试CRT相同的方法。不要忽略它所做的一切,无人区域是早期检测内存损坏的绝佳方法。

答案 1 :(得分:0)

它会调用未定义的行为,这可能会也可能不会使您的应用程序崩溃。它也可能做其他不需要的事情。

即使仅将值0xDDDDDDDD存储为指针(不对其进行反省)也是未定义的行为。