检查已删除对象的值

时间:2015-06-22 15:28:10

标签: c++

我问了一个问题:

Detecting if an object is still active or it has been destroyed

考虑到我不能使用库,C ++中没有开箱即用的解决方案。因此,通过分析已删除对象所在的内存来检查对象是否已被破坏是一种不好的做法,请考虑以下代码:

#include <stdio.h>

class Foo {
 public:
    static unsigned int foo_id_gen;    // unique id generator
    unsigned int id;
    int a;
    Foo() {
      ++foo_id_gen;
      if (foo_id_gen == 0) {           // Handle rollover of unique ID
        ++foo_id_gen;
      }
      id = foo_id_gen;                 // Set unique ID
    }
    ~Foo() {
      id = 0;                          // Set unique ID to Zero
    }
};

unsigned int Foo::foo_id_gen = 0;

class FooPtr {
 public:
    Foo* ptr;
    unsigned int id;
    explicit FooPtr(Foo* foo_obj_ptr) {
      ptr = foo_obj_ptr;
      id = foo_obj_ptr->id;
    }
    bool valid() {
      return (ptr->id == id);
    }
};

int main() {
  Foo* A = new Foo;
  FooPtr APtrOjb(A);
  printf("Is valid?: %s\n", APtrOjb.valid() ? "Valid" : "Not Valid");
  delete A;
  printf("Is valid?: %s\n", APtrOjb.valid() ? "Valid" : "Not Valid");
}

当创建类Foo的对象时,它将获得一个永远不会为零的唯一ID,当删除该对象时,析构函数会将唯一ID设置为零。那么FooPtr类型的对象可以通过检查id是否匹配来检查类Foo的对象是否仍然有效。

注意:我意识到检查id不会100%获得结果,因为当内存被用于其他目的时,匹配可能发生的可能性很小。因此,假设可以加强id验证方法以获得100%的结果,这是一个可行的解决方案吗?

有人建议此问题类似于C++ delete - It deletes my objects but I can still access the data?,但他的问题是关于删除数据,但我的问题是检测对象是否已被删除。

1 个答案:

答案 0 :(得分:2)

非常糟糕,访问已删除的对象就像它们未被删除一样会在一般情况下崩溃。无法保证内存仍在进程内映射,并且可能导致虚拟内存页面错误。

内存也可能会被重新用于同一个类的不同实例,所以它看起来是有效的,但事实并非如此。

通常,这种设计会导致很难分析的错误。

您的测试程序范围也非常有限。它不能说大型程序的行为。