我发现了在解除分配的内存中访问时没有运行时错误的奇怪问题。
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()函数是否发现没有内存错误。
出了什么问题?
答案 0 :(得分:2)
这是因为运气不好。您正在使用无效指针调用未定义的行为。您不能保证运行时错误,您无法保证任何事情。它未定义。
它不会让你崩溃的实际原因是因为Delay()
实际上并没有访问任何成员变量。所以基本上,Delay()
也可以写成独立的功能(在课堂外)。
关于IsBadReadPtr
,请展示一些代码以演示您正在谈论的内容。但请记住,IsBadReadPtr
是操作系统级别的调用,而new
和delete
是语言结构。就像您无法混合new
和free
一样,您无法依赖new
/ delete
和IsBadReadPtr
之间的互操作性。
编辑:我说运气不好,因为你的代码存在严重的问题,但由于偶然性,它是不可见的。如果应用程序崩溃,揭示错误,那就更好了。