在已释放的内存中访问
Access in deallocated memory
我发现了奇怪的问题,在释放的内存中访问时没有运行时错误。
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
是操作系统级别的调用,而new
和delete
是语言结构。就像你不能混合new
和free
一样,你不能依赖new
/delete
和IsBadReadPtr
之间的互操作性。
编辑:我说运气不好,因为你的代码有严重的问题,但由于偶然性,它是看不见的。如果应用程序崩溃,揭示错误,那就更好了。
相关文章:
- 特里树.无法访问内存
- 如何使用 C/C++ 访问内存的内容?
- 指针可以用于访问内存中的任何任意区域吗?
- 分段错误:无法访问内存
- SIGABRT 在线程中访问内存时
- 访问内存以内联循环访问数组
- 如何从C或C 语言级别安全访问内存映射的硬件寄存器
- 在释放了所有作用域内指针之后仍然可访问内存
- 有什么快速访问内存的技巧吗
- CUDA非法访问内存
- C++ 访问内存冲突
- 悬空指针仍在访问内存值
- 当我尝试从结构列表中访问内存时出现错误:" Program received signal SIGSEGV, Segmentation fault."
- 如何访问内存映射的 USB 主控制器寄存器
- 访问内存时出现奇怪的崩溃
- 如何在C++读取块后访问内存中的文件数据
- 使用共享库时仍可访问内存
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- Win32应用程序,可无限制地访问内存
- 强制两个线程直接访问内存中的全局变量