C++ 释放内存中的访问

C++ 释放内存中的访问,c++,memory,delete-operator,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; }

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

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;
}
类测试{
公众:
Test(intidx):c(idx){
~Test(){

std::cout发生这种情况是因为运气不好。您正在使用无效指针调用未定义的行为。您不一定会发生运行时错误,也不一定会发生任何事情。它是未定义的

它不会崩溃的实际原因是
Delay()

关于
IsBadReadPtr
,展示一些代码来演示您正在谈论的内容。但请记住
IsBadReadPtr
是操作系统级调用,而
new
delete
是语言结构。正如您不能将
new
free
混合使用一样,您不能依赖
之间的互操作性>新建
/
删除
IsBadReadPtr

编辑:我说运气不好是因为你的代码有严重的问题,但由于偶然的机会,它是看不见的。如果应用程序崩溃,暴露出错误,运气会更好