2

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

CSMLNode
{
   CSMLNode *pChild;
   CSMLNode *pSibling;  

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

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

我打算将 pChild 和 pSibling 的值设置为0xDDDDDDDD,如果从池中获取节点对象时其值不为 NULL 。我的意图是强制使应用程序崩溃,当pChildpSibling指针被访问时,没有设置适当的对象指针,pChild以及pSibling从池中获取节点对象之后。

这会按我的预期工作吗?如果没有,我应该为强制访问冲突提供什么指针值。

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

4

2 回答 2

4

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

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

于 2012-04-14T07:59:28.393 回答
0

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

即使只是将值存储0xDDDDDDDD为指针(不取消引用它)也是未定义的行为。

于 2012-04-14T07:14:38.377 回答