问题标签 [heapalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
5364 浏览

c++ - Windows C 代码上的内存分配

我想知道在 Windows C 编程中推荐哪种方法:使用 malloc 或 Win32 HeapAlloc(可能是 VirtualAlloc?)函数。

我已经阅读了 MSDN内存管理函数文章和有关 malloc 和 HeapAlloc 的 MSDN 文章,但他们没有说明应该使用哪一个以及在什么情况下使用。

0 投票
2 回答
4614 浏览

heap-memory - HeapAlloc 返回 0xC0000017: Not Enough Quota

我分配了少量数据类型,总大小为 2mb。

我只使用一个堆,它运行良好,直到我得到一定数量的分配,我很确定这一点,因为我已经评论了一个分配,让它在下一个崩溃。

配额=磁盘空间?该文档没有涵盖此特定功能的错误代码,我已经分析了应用程序并且为该进程分配了大量可用内存。另外我在堆指针上放了一个数据断点,它不会中断。当我单步执行时,堆指针很好,直到我调用 HeapAlloc。

这么奇怪..

0 投票
4 回答
5390 浏览

c++ - HeapAlloc 使用什么对齐方式

我正在开发一个使用 Win32 的HeapAlloc的通用库

MSDN 没有提到 Win32 的 HeapAlloc 的对齐保证,但我确实需要知道它使用什么对齐,这样我才能避免过多的填充。

在我的机器(vista,x86)上,所有分配都以 8 个字节对齐。其他平台也是这样吗?

0 投票
1 回答
2799 浏览

c - (C) 堆分配器的实现策略?

哪里有一些很好的资源来查看实现堆分配器的不同方式的优缺点?优先考虑涉及效率(碎片化、吞吐量等)的资源。我不是在寻找简单的代码存储库。

编辑:

我对这个 wiki 的哲学基础并不感兴趣。因此,我真的不想进入“为什么”我对此感兴趣。不管潜在的意图/问题/等等,这些信息都是存在的,所以如果你知道任何好的资源,请在这里链接到它们!

0 投票
3 回答
2818 浏览

c - (C) 堆分配器如何处理 4 字节的块头,同时只返回 8 的倍数的地址?

这似乎没有意义,除非我们只是忽略段开头的任何潜在多余空间,然后让第一个分配的块位于 8 的第一个倍数(其对应的第一个标头是该地址 -4) . 这将在未使用之前留下许多字节。一般都是这样吗?

编辑: 感谢 paxdiablo 下面的详细解释。这对于 16 字节的标头都是有意义的。但是,我正在使用一个 4 字节的标头,看起来像这样:

现在,如果我的堆从一个 8 的倍数的地址开始,并且 malloc 返回的任何地址都需要是 8 的倍数,并且我需要使用 4 字节标头,我似乎被迫“浪费”第一个我的堆的 4 个字节。例如:

如果堆在地址 8 的上述胡萝卜处开始,使用本示例中的寻址方案,在 malloc 调用之后我可以返回给用户的第一个可返回地址将是 16;我需要 4 个字节的标头,第一个地址是 8 的倍数,允许 4 个字节的标头是 16(标头从 12 开始)。这意味着我浪费了内部堆内存的前 4 个字节来排列东西(8-11)。

这是一个可以接受的牺牲,还是我想错了?

0 投票
1 回答
378 浏览

c - (C) 最常使用哪些堆策略?

我听说'better-fit'很常用,但我似乎没有在网上阅读太多关于它的内容。堆分配器最常用/被认为是最有效的策略是什么。

(我承认我的词汇可能有缺陷;当我说“政策”时,我的意思是“最适合”、“第一次适合”、“下一次适合”等)

编辑:我也对“更适合”的堆策略和 doug lea 的策略(http://gee.cs.oswego.edu/dl/html/malloc.html)的比较特别感兴趣。Doug 使用一种最佳拟合,但他的方法使用索引箱,而更好的拟合使用笛卡尔树。

0 投票
2 回答
1544 浏览

c++ - PIMPL 和堆栈分配

所以我一直在考虑 PIMPL 和堆栈分配。我一直在编写一个库,并决定使用 PIMPL 来隐藏该类的私有成员。这意味着我会有一个像这样声明的类

这很简单。但是然后在构造函数中你这样做

因此,当有人使用我的库在堆栈上创建 Foo 时,他们本质上是在进行堆分配。这是您在使用 PIMPL 时必须接受的权衡吗?我想在构造函数旁边发布带有警告的文档:“警告:这会导致堆分配”或类似的东西。

我的另一个想法是让所有暴露给实现的类作为纯虚拟接口和一大堆返回智能指针的静态工厂方法。这也意味着堆分配,但没有任何技巧。

有什么想法或建议吗?我是否过分考虑使用我的库的程序员?

0 投票
2 回答
1530 浏览

windows - HEAP_NO_SERIALIZE 标志

当我在前面的代码示例中调用 HeapCreate 函数时,我使用了 HEAP_NO_SERIALIZE 标志,因为示例代码的其余部分不是多线程安全的。

Jeffrey Richter 在他的书(Windows via C/C++)中写了这句话,
但这很奇怪。
如果代码不是多线程安全的,他就不必使用该标志。
它是一个错误吗?还是我误解了什么?

0 投票
2 回答
3285 浏览

winapi - malloc 和 HeapAlloc 之间是否存在根本区别(除了可移植性)?

由于各种原因,我正在尝试将代码从 C 运行时移植到使用 Windows 堆 API 的代码。我遇到了一个问题:如果我将 /// 调用重定向到// ( mallocwith for the handle ) ,内存似乎分配正确(没有返回错误指针,也没有抛出异常),但是我的库由于某种原因,移植说“未能分配内存”。callocreallocfreeHeapAllocHeapReAllocHeapFreeGetProcessHeap

我已经用 Microsoft CRT(它在下面使用 Heap API)和另一家公司的运行时库(它在下面使用 Global Memory API)尝试了这个;两者的 malloc 都适用于库,但由于某种原因,直接使用堆 API 不起作用。

我检查了分配不是太大(> = 0x7FFF8 字节),但它们不是。

我能想到的唯一问题是内存对齐;是这样吗?或者除此之外,堆 API 和 CRT 内存 API 之间是否存在我不知道的根本区别?

如果是这样,它是什么?如果不是,那么为什么静态Microsoft CRT(包含在 Visual Studio 中)在调用malloc/calloc之前会采取一些额外的步骤HeapAlloc?我怀疑有区别,但我想不出它可能是什么。

谢谢!

0 投票
4 回答
2091 浏览

c - 为内存数据结构寻找一个安全的幻数


我正在实现一个堆分配器(malloc),我需要选择一个幻数来检查给定的指针是否指向我分配的数据结构。对我来说,显然没有任何幻数可以被认为是完全安全的(如果检查了这个数字,我可以确定指向我的数据结构之一),但也许我错过了一些东西,所以......如果有人可以帮助和把我梦想的数量带给我,我真的很感激。提前谢谢。