2012-04-14 71 views
2

我们有一个类来表示一个非常大的应用程序列表:无效指针强制应用程序崩溃

CSMLNode 
{ 
    CSMLNode *pChild; 
    CSMLNode *pSibling; 

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

为了优化,创造了被关在一个游泳池和反复使用的寿命的节点对象应用。节点对象仅在节点对象的数量超过特定计数时才被释放。当节点对象释放到池中或从池中取出时,值pChildpSibling未设置为NULL。我们认为这会导致应用程序崩溃。

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

这个工作是否符合我的预期?如果没有,我应该给予强制访问违规的指针值。

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

+3

阻止您在发布过程中将指针设置为NULL吗? – 2012-04-14 07:18:50

+0

我不确定。我们正在分析 – Maanu 2012-04-14 07:20:33

+0

为什么不在创建对象时将这些指针设置为适当的值(NULL或适当的其他位置),而与是否在发布时将它们设为空值无关。你的构造函数不应该让你使用随机内存。 – 2012-04-14 14:47:15

回答

4

Visual Studio调试CRT已经这样做了。你从堆中分配的内存被初始化为0xcdcdcdcd。由于你的结构包含指针,取消引用未初始化的指针会自动生成一个AV。调试堆初始化值为documented here

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

0

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

即使只是将值0xDDDDDDDD作为指针存储(不解除它)也是未定义的行为。

+0

我不明白你的意思 – Maanu 2012-04-14 07:17:08

+0

@Maanu - 某些硬件有专用的地址寄存器来验证指针。只要将一个无效值加入其中一个就可以杀死你的程序。所以这个语言说它没有定义。 – 2012-04-14 10:14:26

+0

@Maanu:我认为问题是未定义的行为可能会导致程序的继续执行。 – suszterpatt 2012-04-14 14:51:50