在释放的内存中访问

时间:2015-02-04 15:13:11

标签: c++ memory delete-operator

我发现了在解除分配的内存中访问时没有运行时错误的奇怪问题。

class Test {
public:
  Test(int idx) : c(idx) {}
  ~Test() {
    std::cout << "destructor\n";
  }
  void Delay() {
    Sleep(500);
    std::cout << "delay " << c << "\n";
  }
protected:
  int c;
};

int _tmain(int argc, _TCHAR* argv[])
{
  for (int idx = 0; idx < 100; idx++) {
    Test* test = new Test(idx);
    Test*temp = test;
    delete test; test = NULL;
    temp->Delay();
  }

  std::cout << "Exit\n";

  Sleep(1000);
  return 0;
}

变量&#34; test&#34;取消分配,并且临时具有以前的内存地址&#34; test&#34;。 但用&#34; temp&#34;调用Delay()函数没有运行时错误。 我怎么能理解呢?

在Delay()函数中,检查IsBadXXXPtr()函数是否发现没有内存错误。

出了什么问题?

1 个答案:

答案 0 :(得分:2)

这是因为运气不好。您正在使用无效指针调用未定义的行为。您不能保证运行时错误,您无法保证任何事情。它未定义。

它不会让你崩溃的实际原因是因为Delay()实际上并没有访问任何成员变量。所以基本上,Delay()也可以写成独立的功能(在课堂外)。

关于IsBadReadPtr,请展示一些代码以演示您正在谈论的内容。但请记住,IsBadReadPtr是操作系统级别的调用,而newdelete是语言结构。就像您无法混合newfree一样,您无法依赖new / deleteIsBadReadPtr之间的互操作性。

编辑:我说运气不好,因为你的代码存在严重的问题,但由于偶然性,它是不可见的。如果应用程序崩溃,揭示错误,那就更好了。