C++,Free-Store vs Heap

Nic*_*kis 112 c++ memory-management

new/delete据说动态分配在免费商店中进行,
malloc/free操作则使用.

在实践中,我想知道是否存在实际差异.
编译器是否区分了这两个术语?(免费商店,不new/malloc)

Mic*_*val 69

http://www.gotw.ca/gotw/009.htm ; 它可以比我更好地描述堆和免费商店之间的差异:

免费店:

免费存储是两个动态内存区域之一,由new/delete分配/释放.对象生存期可以小于分配存储的时间; 也就是说,免费存储对象可以在不立即初始化的情况下分配内存,并且可以在不立即释放内存的情况下销毁它们.在分配存储但在对象的生命周期之外的期间,可以通过void*访问和操作存储,但是可以访问原始对象的非静态成员或成员函数,获取其地址,或者以其他方式操纵.

堆:

堆是另一个动态内存区域,由malloc/free及其变体分配/释放.请注意,虽然默认的全局new和delete可能由malloc实现并且由特定编译器释放,但堆与free store不同,并且在一个区域中分配的内存无法在另一个区域中安全地释放.从堆分配的内存可以通过放置 - 新构造和显式销毁用于类类型的对象.如果这样使用,关于免费商店对象生存期的注释在此类似地适用.

  • 我不同意.动态分配上下文中的"堆"一词既不是C++标准也不是C99(我没有C++引用的C89,如果它使用了这个词,请随时纠正我).我找不到有问题的GotW发布的日期,但既然它谈到了草案,它显然是预先标准的. (22认同)
  • 这都是术语的问题,恕我直言。说,先生。Stroustrup 不区分“堆”和“自由存储”:http://www.stroustrup.com/Programming/17_free_store.ppt,幻灯片 12。“堆”在 C++ 之前很久就被用作动态内存的同义词,因为 Lisp使用堆数据结构进行内存分配的时间(1960 年代)。 (3认同)
  • 我通常认为堆(通过 maloc/free)是一种“原材料”供应商。你要求一大块内存,你就会得到它。你必须自己建造任何结构。免费商店(新/删除)更像是“成品”供应商。您请求一个对象,它会被分配一些空间,并且该对象会构建并准备供您使用。当它完成后,它会被很好地清理干净。 (3认同)

Kit*_*t10 59

对于C++,免费存储和堆之间的区别已经变得纯粹是概念性的.就像一个用于收集bug的jar和一个用于收集cookie的jar.一个标记为单向,另一个标记为另一个.这个名称的目的是为了让你不要将"new"和"delete"与"malloc","realloc"或"free"(或者就此而言的位级别设置)混合起来.

在访谈期间,最好说"new和delete使用免费商店,malloc并免费使用堆; new和delete分别调用构造函数和析构函数,但malloc和free不会." 然而,您经常会听到内存段实际上位于同一区域 - 但是,这可能是编译器特定的,也就是说,两者都可以将不同的内存空间指定为池(不确定为什么会这样,虽然).


Cra*_*rks 24

Mike Koval的回答很好地涵盖了这个理论.然而,在实践中,它们几乎总是在相同的内存区域 - 在大多数情况下,如果你深入研究编译器的实现new,你会发现它的调用malloc().

换句话说:从机器的角度来看,堆和免费存储是一回事.区别在于编译器内部.

为了让事情更加混乱,在C++出现之前,我们说"堆"意味着现在所谓的"免费商店".


Jim*_*wis 5

术语“堆”也可以指特定的数据结构,但在 C++ malloc、free、new 和 delete 操作的上下文中,术语“堆”和“自由存储”或多或少可以互换使用。