在已释放的内存中访问

Access in deallocated memory

本文关键字:访问 内存 释放      更新时间:2023-10-16

我发现了奇怪的问题,在释放的内存中访问时没有运行时错误。

class Test {
public:
  Test(int idx) : c(idx) {}
  ~Test() {
    std::cout << "destructorn";
  }
  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 << "Exitn";
  Sleep(1000);
  return 0;
}

变量"test"被解除分配,temp 具有"test"的先前内存地址。但是用"temp"调用 Delay() 函数不会是运行时错误。我该如何理解它?

在 Delay() 函数

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

怎么了?

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

它不会为您崩溃的实际原因是Delay()实际上并不访问任何成员变量。所以基本上,Delay()也可以写成一个独立的函数(在类外)。

关于IsBadReadPtr,显示一些代码来演示您在说什么。但请记住,IsBadReadPtr是操作系统级别的调用,而newdelete是语言结构。就像你不能混合newfree一样,你不能依赖new/deleteIsBadReadPtr之间的互操作性。

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