gpt4 book ai didi

rust - 什么是未初始化内存,为什么在分配时没有初始化?

转载 作者:行者123 更新时间:2023-12-05 01:49:39 24 4
gpt4 key购买 nike

将此签名用于 GlobalAllocator 的方法:

unsafe fn alloc(&self, layout: Layout) -> *mut u8

以及方法文档中的这句话:

  • 分配的内存块可能会或可能不会被初始化。

假设我们要为 [i32, 10] 分配一些内存块。假设 i32 的大小为 4 个字节,我们的示例数组将需要 40 个字节用于请求的存储。

现在,分配器找到了符合我们要求的内存点。大约 40 字节的内存区域……但是……那里有什么?我总是阅读术语垃圾数据,并假设它只是已经被另一个进程、程序等存储在那里的旧数据。

  • 什么是单元化内存?只是没有用我们想要存储的类型的一些默认值初始化为零的数据?
  • 为什么不总是在返回指针之前对内存进行初始化?太贵了?但是内存必须要初始化才能正常使用,不至于造成UB。为什么还没有初始化?
  • 当某些资源被释放时,它不能指向释放的内存。那是那个地方归零了吗?当您取消分配一些内存时,究竟会发生什么?

最佳答案

What's unitialized memory? Just data that is not initialized with zeros of with some default value for the type that we want to store there?

比这两个都差。从未初始化的内存中读取是未定义的行为,因为您无法再推断这样做的程序。实际上,编译器经常优化假设会触发未定义行为的代码路径永远不会被执行并且它们的代码可以被删除。或不,取决于编译器的侵略性。

如果您可以可靠地从指针读取数据,它就会包含任意数据。它可能是零,它可能是旧数据结构,它可能是旧数据结构的一部分。它甚至可能是密码和加密 key 之类的东西,这是读取未初始化内存有问题的另一个原因。

Why not always memory it's initialized before returning the pointer? It's too costly? But the memory must be initialized in order to use it properly and not cause UB. Why then doesn't comes already initialized?

是的,成本是个问题。通常在分配一 block 内存后要做的第一件事就是写入它。当调用者无论如何都要用它想要的值覆盖它时,让分配器“预初始化”内存是一种浪费。这对于用于 IO 或其他大型存储的大型缓冲区尤其重要。

When some resource it's deallocated, things musn't be pointing to that freed memory. That's that place got zeroed? What really happens when you deallocate some piece of memory?

这取决于内存分配器是如何实现的。大多数不会浪费处理能力来清除已解除分配的数据,因为它在重新分配时无论如何都会被覆盖。一些分配器可能会将一些簿记数据写入释放的空间。 GlobalAllocator 是系统附带的任何分配器的接口(interface),因此它会因环境而异。

I always read the term garbage data, and assume that it's just old data already stored there by another process, program... etc.

值得注意:所有现代桌面操作系统在进程之间都有内存隔离——您的程序无法访问其他进程或内核的内存(除非您通过专门的功能明确共享它)。内核将在将内存分配给您的进程之前清除内存,以防止泄露敏感数据。但出于上述原因,您可以看到自己流程中的旧数据。

关于rust - 什么是未初始化内存,为什么在分配时没有初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73837626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com