free store 和 heap

free store (自由存储区)和 heap (堆),在C/C++中经常会遇到。他们是否有区别呢?

偶最早发现这两个概念性问题是在《Exceptional C++》一书中。

其中提到C++中使用new分配所得的内存是分配在 freestore 上,而C 风格的内存分配 malloc 分配所得的内存是在 heap 上

额。这个有什么区别呢?

通过在 Google 的搜索,所得的中文资料相当少,英文的倒是不少,而且不少还有争议性质。

不过部分观点是已经达成共识的。

这里,作为翻译,略微加上一点自己的思想,写在这里——

首先呢,有必要知道malloc内存分配和new内存分配上的区别。

前者,是C 语言中很典型的分配方法,它的作用就是根据参数指定大小,分配一定的动态内存空间。

操作系统会处理这件事情,它会遍历系统维护的空闲内存链表来找到大小与之最匹配的内存区域。

(当然也有其他分配算法)

获得了这部分内存,返回给程序员的是一个  void* 类型的指针(其实是无类型)。

释放使用free,其实就是告诉操作系统,这一部分的内存区域不再使用,你可以回收了。

那么,操作系统就会乖乖地把这个内存区的首地址再加入到自身维护的空闲内存链表中。

如果忘记free,后果就是恐怖的“内存泄露”(memory leakage)。

然后,我们再看new。C++中new已经是一个“运算符”了,我们可以重载operator new 和 placement new。

它也是分配内存,同时在这块内存上执行所要new 的对象的构造函数以建立起这个对象。

(说“对象”,略微有点不严格,不过没关系,这个区别已经淡化了,

built-in type ,也就是内置类型,他们也可以被new,执行是这些基本类型的伪构造函数)

对应free,这里有delete。它不仅是free了这块内存,而且执行了对应对象的析构函数

……

某文献上有这么几句:

Note that the heap and free-store may reside on distinct physical memory regions and they might be controlled by different underlying memory managers.

Technically, free-store is an abstract term referring to unused memory that is available for dynamic allocations. Heap is the data model used by virtually all C++ compilers to implement the free-store. In practice, however, the distinction between heap and free-store is roughly equivalent to the differences between the memory models of C and C++.

个人翻译:

注意的是,堆(heap)和自由存储区(freestore)可能是位于不同的物理内存区域,并且它们可能被不同的底层内存管理器控制。

从技术角度来说,freestore 是一个抽象的术语,它表示那些用来动态分配内存的未占用空间。

而 heap 是一个具体形象的数据模型概念,它通过C++编译器去实现扩充了freestore。

事实上,两者的区别有点像是 C 和 C++ 的内存模型的差异。

因为毕竟C++中用malloc,calloc,realloc 和 free 并不多,除非一些特定情况,我们需要获取一部分原始内存(raw memory)。

概念的问题,争论的太深入也没太大必要。有时候毕竟没必要区别他们那么清。

如果你有更好的理解,欢迎在这里提出。

谢谢!~

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 堆使用后释放错误(heap use after free)是指在程序中使用了已经被释放的堆内存。这种错误通常会导致程序崩溃或者出现不可预测的行为。为了避免这种错误,程序员需要在使用完堆内存后及时释放它,并且在释放后不再使用该内存。 ### 回答2: heap use after free是一种常见的内存使用错误,它指的是在使用堆内存时,释放了某个内存块,但后续又继续使用了该内存块。这种错误可以导致程序崩溃、数据损坏,甚至是安全漏洞。 通常,堆内存的分配和释放是由程序员负责的。在程序中,当需要动态分配一块内存时,通常使用malloc()函数,在使用完该内存块之后,需要通过free()函数来释放该内存块。但是,如果程序员在释放内存块之后,依然在程序中继续使用该内存块,则会发生heap use after free错误。 具体来说,当程序释放内存块时,操作系统会将该内存块标记为可用的状态,但是并不会真正销毁该内存块,这意味着该内存块中原有的数据可能还存在,但已经不再属于该内存块。如果程序员在已经释放了内存块的情况下,继续使用该内存块,则可能会覆盖该内存块原有的数据,导致数据损坏。此外,由于已经释放的内存块可能会被操作系统重复利用,这也可能会导致堆内存中存在未预期的数据。 为了避免heap use after free错误,程序员可以采取一些措施。首先,应该在使用内存块之前检查该内存块是否已经被释放,以确保不会继续使用已经释放的内存块。其次,在释放内存块之后,可以将指向该内存块的指针设置为NULL,以避免意外地继续使用该内存块。此外,可以使用一些内存检测工具,如Valgrind等,来帮助检测和排除heap use after free错误。 ### 回答3: Heap use after free(堆溢出)是一种常见的内存管理错误,它会导致程序崩溃或者安全漏洞。 当程序中使用malloc()、realloc()、calloc()等动态分配内存的函数后,程序会在堆区域内分配内存,同时也会记录该块内存的大小和地址等信息。而当程序中释放该块内存时,通过free()函数将其返回给操作系统并将相关记录清空,但是在程序中,如果继续使用已经释放的内存,就会导致Heap use after free错误。 通常,程序员在使用free()函数释放内存后,应该将指向该内存的指针设置为NULL,以避免后续误用该指针。否则,指针会指向之前释放的内存地址,后续再次访问该指针就会导致程序崩溃或者执行错误的操作。 堆溢出还可能是一些恶意程序攻击的手段。攻击者在程序中制造类似的堆溢出漏洞,以便在运行时利用该漏洞来执行恶意代码。这种攻击被称为堆溢出攻击(Heap Overflow Attack)。 对于企业和个人开发者来说,避免Heap use after free错误可以通过以下几个方面来做到。 1. 了解内存分配释放的细节,在编写程序时注意不要出现内存泄露、重复释放等问题。 2. 使用内存分配和释放函数时,必须正确地管理内存指针,不要造成内存泄露或者重复释放的问题。 3. 使用编译器的内存检查工具进行内存检查,如Valgrind、Clang、GCC等。 4. 在编写程序时,可以使用一些内存管理工具和库,如Boost库、STL库等。这些工具和库可以帮助程序员进行内存管理和错误检测,减少代码错误的可能性。 总之,了解和避免Heap use after free错误是编写高质量、可靠和安全的程序的必要条件之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值