问题标签 [malloc]
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.
c - 我应该费心在我的 C 代码中检测 OOM(内存不足)错误吗?
我已经将大量的 C 代码行用于清理标签/条件以用于失败的内存分配(由alloc
返回的系列表示NULL
)。我被告知这是一种很好的做法,因此,在内存故障时,可以标记适当的错误状态,并且调用者可以潜在地执行“优雅的内存清理”并重试。我现在对这种哲学有一些疑问,我希望能澄清一下。
我想调用者可能会释放过多的缓冲区空间或剥离其数据的关系对象,但我发现调用者很少有能力(或处于适当的抽象级别)这样做。此外,从被调用函数中提前返回而没有副作用通常很重要。
我还刚刚发现了 Linux OOM 杀手,这似乎使这些努力在我的主要开发平台上毫无意义。
默认情况下,Linux 遵循乐观的内存分配策略。这意味着当 malloc() 返回非 NULL 时,不能保证内存确实可用。这是一个非常糟糕的错误。如果发现系统内存不足,一个或多个进程将被臭名昭著的 OOM 杀手杀死。
我认为可能还有其他平台遵循相同的原则。是否有一些实用的东西使得检查 OOM 条件值得?
c - 从函数内重新分配
我有一个名为 ball 的结构、多个球、一个球数组和一个我想向数组添加新球的函数:
结构:
(非工作功能):
和main中的函数调用:
对该函数的调用失败并显示以下错误消息:
有什么帮助吗?
这有帮助。它现在可以编译,但我在运行时遇到分段错误错误。如果感兴趣,这是完整的代码:
c++ - C ++中的“new”和“malloc”和“calloc”有什么区别?
new
“ ” 和 “ malloc
” 和 “ ” 和家庭中的其他人有什么区别calloc
?
(什么时候)我需要“ new
”以外的东西吗?
其中一个是使用其他实现的吗?
c++ - 何时使用 Malloc 而不是 New
只是重新阅读这个问题:
C ++中的“new”和“malloc”和“calloc”有什么区别?
我检查了答案,但没有人回答这个问题:
- 我什么时候会使用 malloc 而不是 new?
有几个原因(我可以想到两个)。
让最好的漂浮到顶部。
windows - 64 位大型 malloc
malloc() 失败的原因是什么,尤其是在 64 位中?
我的具体问题是试图在 64 位系统上分配 10GB 的巨大 RAM 块。这台机器有 12GB 的 RAM 和 32GB 的交换空间。是的,malloc 是极端的,但为什么会有问题呢?这是在带有 Intel 和 MSFT 编译器的 Windows XP64 中。malloc 有时会成功,有时不会,大约 50%。8GB malloc 总是有效,20GB malloc 总是失败。如果 malloc 失败,重复请求将不起作用,除非我退出该进程并再次启动一个新进程(然后将有 50% 的成功率)。没有其他大型应用程序正在运行。它甚至在重新启动后立即发生。
如果您用完了可用的 32(或 31)位地址空间,我可以想象 malloc 在 32 位中失败,这样就没有足够大的地址范围来分配给您的请求。
如果你用完了物理 RAM和硬盘交换空间,我也可以想象 malloc 会失败。这不是我的情况。
但是为什么 malloc 会失败呢?我想不出其他原因。
我对一般 malloc 问题比我的具体示例更感兴趣,无论如何我可能会用内存映射文件替换它。失败的 malloc() 比其他任何事情都更像是一个谜……渴望了解您的工具而不是对基本原理感到惊讶。
c - 为什么我应该在“char bigchar[1u << 31 - 1];”时使用 malloc() 工作得好吗?
与静态数组相比,使用 malloc(除了失败时返回 NULL)有什么优势?以下程序将占用我所有的内存并仅在未注释循环时才开始填充交换。它不会崩溃。
...
...
经过反复试验,我发现上面是我的 32 位 Intel 机器上允许使用 GCC 4.3 的最大静态数组。这是标准限制、编译器限制还是机器限制?显然,我想拥有多少就拥有多少。它会出现段错误,但前提是我要求(并尝试使用)多于 malloc 无论如何都会给我。
有没有办法确定静态数组是否实际分配并安全使用?
编辑:我对为什么使用 malloc 来管理堆而不是让虚拟内存系统处理它感兴趣。显然,我可以将数组的大小设置为我认为需要的大小的许多倍,并且虚拟内存系统只会将所需的内容保存在 ram 中。如果我从不写这些巨大数组的结尾(或开头),那么程序就不会使用物理内存。此外,如果我可以写入每个位置,那么除了在堆中增加一个指针或在同一进程中搜索先前的分配之外,malloc 还能做什么?
编者注: 如果 int 是 32 位,1 << 31
则会导致未定义的行为1u
,因此我已将问题修改为 read 。该问题的目的是询问有关分配大型静态缓冲区的问题。
c - uchar 的模拟内存数组中的 int
在 C 语言中,在 Unix 环境(Plan9)中,我有一个数组作为内存。
我需要该数组包含不同的字段,例如一个 int(整数)来指示可用内存的大小。所以,我试过这个:
我知道 int 的大小是 4,所以我必须强制使用强制转换或类似的东西,在这种情况下,mem 的前四个插槽的内容有数字 250,它是大端。
但问题是当我尝试做我解释过的事情时它不起作用。我想类型转换有误。我希望问你,我怎么能强制 mem[0] 到 mem[3] 具有指示的大小,表示为 int 而不是 uchar?
提前致谢
c - 2 字节的 Malloc 会产生问题
我正在尝试使用短的 malloc,例如
我调试了几天,一无所知,
注意(已编辑):Linux 和 gcc 版本 3.4.6 20060404
使用 VALGRIND 发现的问题
但是,我想在这里记录它,以便我的开发人员同伴可能会意识到这种情况......
我实际上已经将结构定义为
以及我还定义的代码中的其他地方
因此, sizeof (ALBUM) 指的是 #define 值而不是 typedef ,因此是问题所在。
让我吃惊的是,
这在 C 中是否允许?
c - malloc 线程安全吗?
函数是malloc()
可重入的吗?
windows - Windows malloc 替换(例如 tcmalloc)和动态 crt 链接
使用多个 DLL 和 QT 的 C++ 程序应配备 malloc 替代品(如tcmalloc),以解决可验证为由 Windows malloc 引起的性能问题。使用 linux,没有问题,但是使用 windows,有几种方法,我发现它们都不吸引人:
1.将新的malloc放入lib并确保首先链接它(其他SO问题)
这有一个缺点,例如strdup 仍将使用旧的 malloc 并且 free 可能会使程序崩溃。
2. 使用 lib.exe (Chrome) 从静态 libcrt 库中删除 malloc
这已针对chrome/chromium进行了测试/使用(?),但缺点是它仅适用于静态链接 crt。如果一个系统库与 msvcrt 动态链接,则静态链接会出现问题,堆分配/释放中可能存在不匹配。如果我理解正确,tcmalloc 可以动态链接,这样所有自编译的 dll 都有一个公共堆(这很好)。
3.补丁crt-源码(firefox)
Firefox 的 jemalloc显然修补了 windows CRT 源代码并构建了一个新的 crt。这又出现了上面的静态/动态链接问题。
可以考虑使用它来生成动态 MSVCRT,但我认为这是不可能的,因为许可证禁止提供具有相同名称的修补 MSVCRT。
4.在运行时动态修补加载的CRT
一些商业内存分配器可以做到这一点。tcmalloc 也可以,但这看起来相当难看。它有一些问题,但它们已得到修复。目前,使用 tcmalloc 它不能在 64 位窗口下工作。
有更好的方法吗?任何意见?