【问题标题】:Preservance of memory blocks created by mallocmalloc 创建的内存块的持久性
【发布时间】:2012-10-25 12:07:16
【问题描述】:

我有一个问题要问,这是在阅读静态变量的概念时发生的。如果我在函数中创建一个分配的内存块,使用malloc,然后函数返回到main,而没有在分配的内存上使用free(),那么该内存块是否会在处理过程中容易发生变化?程序,与否?我的意思是,在我离开函数之后,内存块可能会被另一个进程覆盖,而我想以我的方式使用它和/或编辑它,或者它是否被类似的东西“锁定”,直到我免费吗?是否有可能在我释放之前将该块视为没有数据?

【问题讨论】:

  • 语言是C,以防你没有得到它:P

标签: c memory malloc free memory-corruption


【解决方案1】:

一旦您malloced 一定数量的字节,除非您明确地free 它,否则它将在您的程序的整个生命周期内一直存在。

无论您在哪个函数中执行了malloc,只要您有一个指向malloced 内存的有效指针,该内存就可以在程序中的任何位置使用。

【讨论】:

    【解决方案2】:

    C 标准指定了一个名为 allocated存储持续时间(在 C99 6.2.4 对象的存储持续时间中。)分配存储的生命周期来自分配(使用 malloc, calloc, realloc) 直到被释放(使用 free 或 realloc)。所以,是的,从函数返回不会使分配的存储无效(不像 自动 存储,如局部变量)。您可以期望它仍然被分配。只要您有指向此类存储的有效指针,您就可以对其进行读写。

    【讨论】:

      【解决方案3】:

      当使用 malloc 分配内存时,只要您的程序正在运行并且您不释放此内存块,它就会一直分配给您的程序。所以这个内存块不能被另一个进程修改或覆盖。

      【讨论】:

        【解决方案4】:

        通常,分配的内存块不能被另一个进程覆盖,因为这两个进程驻留在两个不同的虚拟地址空间中,除非您以某种方式与另一个进程共享内存块,例如this

        【讨论】:

          【解决方案5】:

          好的,所以我想你是问在这种情况下会发生什么......

          #include <stdlib.h>
          
          void myfunc( void )
          {
              static void* p = malloc(BLOCK_SIZE);
              // perhaps the rest of this function uses the pointer to the allocated mem...
          }
          
          int main( int argc, char** argv )
          {
              myfunc();
              // the rest of the program goes here...
          }
          

          ...并询问“程序的其余部分”代码是否可以写入myfunc()分配的内存块。

          堆仍然会分配内存,因为它不知道只有myfunc() 中的代码拥有指向内存块的指针。但它也不会“锁定”它(即保护它不被写入——C 语言本身没有这样的概念。)

          由于堆仍然认为内存块已分配,因此使用后续malloc() 的代码不会获得指向您已分配的块内的块的指针。 myfunc() 之外的任何代码都不会知道指针 p 的值。因此,任何以后的代码最终写入块的唯一方法是“意外”通过某种方式获得一个指向恰好位于块内存中的位置的指针(可能是由于某种代码错误),然后写入它。

          【讨论】:

          • 我不认为static void* p = malloc(BLOCK_SIZE); 会起作用。
          • 有点复杂的答案。感谢您的回复,之前的答案涵盖了我的担忧。是的,我的意思是如果块可以意外更改,而不是通过使用指针。例如,就像你说的,如果一个新的 malloc 可以通过“心爱的”内存块提供一个指针:P
          猜你喜欢
          • 1970-01-01
          • 2011-04-21
          • 2013-07-14
          • 2023-03-14
          • 2012-01-18
          • 1970-01-01
          • 2014-01-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多