提问人:canh25xp 提问时间:8/11/2023 最后编辑:canh25xp 更新时间:8/11/2023 访问量:159
在 C++ 中,delete 运算符实际上是如何工作的?(在内存级别)
In C++, how does the delete operator actually work? (At the memory level)
问:
我知道它从堆中释放内存。但是程序如何知道内存正在释放(或未释放)。如果我必须猜测,程序内存中的某个地方有某种“可用内存列表”。如果是这样的话,这个列表是如何构成的?它是由程序管理还是由操作系统管理?
我创建了一个简单的程序来尝试找出发生了什么:
#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;
}
ptr 在 delete 运算符之前指向的内存位置:
相同的内存位置,但在删除运算符之后:
为什么旧的内存位置在被删除后总是充满0xDDDDDDDD?它是否表示内存已释放?如果它已经在假设的“可用内存列表”中跟踪它,为什么还要费心这样做?我的意思是写到记忆中需要一些努力(尽管在这个例子中可以忽略不计),为什么不把它留在那里,直到其他东西覆盖它。
虽然最初 ptr 指向某个随机地址,但在删除操作后,它始终指向 0x0000000000008123。它是否也是一个标记,指示指针现在指向无法访问的内存块?
(我在 Windows 10 64 位操作系统上使用 Visual Studio 2022)
只是一些指向好文章的链接也会有所帮助。谢谢。
答:
为什么旧的内存位置在删除后总是充满0xDDDDDDDD?
平台的调试版本在释放后对内存执行0xDD。memset
标准中未规定。这是特定于您的平台的实现细节。
Q.V. 值的幻数。DDDDDDDD
它是否表示内存已释放?如果它已经在假设的“可用内存列表”中跟踪它,为什么还要费心这样做?我的意思是写到记忆中需要一些努力(尽管在这个例子中可以忽略不计),为什么不把它留在那里,直到其他东西覆盖它。
它在那里帮助调试。
虽然最初 ptr 指向某个随机地址,但在删除操作之后,它始终指向 0x0000000000008123。它是否也是一个标记,指示指针现在指向无法访问的内存块?
可能不是。即使在语句之后访问也是未定义的行为。您应该在之后再次访问该值是合法的。ptr
delete ptr;
ptr = nullptr;
delete
ptr
评论
*ptr