我知道它是从堆中释放内存。但是程序如何知道正在释放的内存(或未被释放)。如果我要猜测,程序的内存中可能有一种“可用内存列表”。如果是这样的话,那么这个列表是如何构建的呢?它是由程序还是操作系统管理的?
我创建了一个简单的程序来尝试弄清楚发生了什么:
指向 delete 操作符前的 ptr 所指向的内存位置。
尽管最初指针(ptr)指向某个随机地址,但在删除操作之后,它总是指向0x0000000000008123。这也是一个标记,表示指针现在指向一个无法访问的内存块吗?
(我正在使用Windows 10上的Visual Studio 2022,64位操作系统)
提供一些好文章的链接也会很有帮助。谢谢。
我创建了一个简单的程序来尝试弄清楚发生了什么:
#include <iostream>
int main () {
int* ptr = new int;
*ptr = 0xFFFFFFFF;
std::cout << ptr << std::endl; //some random 64-bit address
std::cout << *ptr << std::endl; //-1
delete ptr;
std::cout << ptr << std::endl; // always 0x0000000000008123
std::cout << *ptr << std::endl; // Exception thrown: read access violation.
return 0;
}
指向 delete 操作符前的 ptr 所指向的内存位置。
在删除运算符后的相同内存位置:
尽管最初指针(ptr)指向某个随机地址,但在删除操作之后,它总是指向0x0000000000008123。这也是一个标记,表示指针现在指向一个无法访问的内存块吗?
(我正在使用Windows 10上的Visual Studio 2022,64位操作系统)
提供一些好文章的链接也会很有帮助。谢谢。
*ptr
之后,实际上你正在创建一个已经被删除的指针的使用,并且内存覆写会导致崩溃,这是预期的行为。 - tadman