【问题标题】:How to validate deleted pointer? [duplicate]如何验证已删除的指针? [复制]
【发布时间】:2017-10-08 06:32:45
【问题描述】:

可能这是一个非常愚蠢的问题。但我不知道这个问题的答案。

如果指针所指的对象被某人删除(我们不知道是谁在删除它),但我仍然有指向它的原始指针。如何验证它是否有效。我虽然空检查会有所帮助,但它没有。

这是一个例子:

int main()
{
   class A
   {
   public:
      A() = default;
      ~A() = default;
   private:
      int a;
      long b;
   };

   A* a = new A();
   delete a; // deleted here
   A* b = reinterpret_cast< A* >( a ); // still trying to use it 
   if( b == nullptr )
      std::cout << "B is Null"; // b should have come as null, but it does not and I do not see this line in output.

   // same here
   A* c = ( A* ) a;
   if( c == nullptr )
      std::cout << "C is null";
   getchar();
    return 0;
}

如上图所示,a 不为空,并且有一些垃圾值。

我知道这是非常幼稚的代码,但这表明我在实际代码中遇到的问题。

谢谢, 凯拉斯

【问题讨论】:

  • 您无法验证指针是否指向有效内存,您只需要了解自己即可。
  • 在每个系统的基础上,许多人做代码断言检查指针是否指向有效内存。什么是有效的,但系统之间的差异很大,因此您必须对每个系统进行本地编码。老实说,这是一张很棒的支票,
  • 您应该将new A() 创建的指针存储到std::unique_ptr&lt;A&gt; 中。这样它会在超出范围时自动销毁(您仍然可以手动删除它)。这并不能完全回答您的问题,但在您的代码 sn-p 中它会解决您的问题。

标签: c++ c++11 pointers nullpointerexception void-pointers


【解决方案1】:

不,你无法知道指针是否指向有效内存。

来自here

因为维护有关内容的元数据会很昂贵 构成一个有效的指针,什么不构成,而在 C++ 中你不需要支付 对于你不想要的。

此外,您实际上并不需要检查指针是否有效,因为作为程序员,您知道指针的来源。

【讨论】:

    【解决方案2】:

    您可以使用if(!a)if(a) 进行验证。

    【讨论】:

    • 在 0 是有效地址(向量表指针等)的系统上呢?正如其他地方所评论的那样,这有点过于宽泛了。
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 2019-10-29
    • 2012-09-27
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多