【问题标题】:Invalid pointer to forcefully crash the application强制使应用程序崩溃的指针无效
【发布时间】:2012-04-14 07:12:13
【问题描述】:

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

CSMLNode
{
   CSMLNode *pChild;
   CSMLNode *pSibling;  

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

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

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

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

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

【问题讨论】:

  • 是否有什么东西阻止你在发布期间将指针设置为 NULL?
  • 我不确定。我们正在分析
  • 为什么不在创建对象时将这些指针设置为适当的值(NULL 或适当的其他位置),而不管您是否在发布时将它们设为空。您的构造函数不应该让您使用随机内存。

标签: c++ visual-studio-2008


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @Maanu - 一些硬件有专用的地址寄存器来验证指针。只是将无效值放入其中之一可能会杀死您的程序。所以语言说它是未定义的。
    • @Maanu:我认为关键是未定义的行为很可能会导致程序继续执行。
    猜你喜欢
    • 2011-05-16
    • 2017-08-13
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多