Tag: 内存管理

alloc,malloc和alloca – 有什么区别?

我的印象是Objective-C中的alloc (当我们调用[anyObject alloc]实际上是在实现C函数malloc并且内存在堆中分配,但无法找到答案)。 此外,在搜索alloc ,我发现alloca在堆栈中分配内存。 如果我没有错, alloc在堆中分配内存来创建对象。 那么, alloc和malloc (和alloca )有什么区别? 任何人都可以总结一下吗?

释放内存两次

在C和C ++中,释放NULL指针将导致无法完成任务。 不过,我看到有人说如果你“两次释放内存”会导致内存损坏。 这是真的? 当你释放记忆两次时,引擎盖下发生了什么?

GNU调试器的GUI

我非常兴奋使用GNU调试器和一个名为Insight的GUI,因为它为我节省了很多时间。 因此,我在其他新手那里发布这个问题/答案,就像我在他们的C代码中遇到问题,寻找可视方式来查看正在发生的事情。 我正在研究Linux Mint(Ubuntu)btw。

C:内存池库?

我需要一些快速,线程安全的内存池库。 我已经google了很多,但快速的解决方案没有线程安全,而其他人真的很大。 有什么建议?

重新分配后,我们是否会在缓冲区中丢失数据?

我很难理解realloc是如何工作的。 如果我malloc’ed缓冲区并将数据复制到该缓冲区,让我们说“AB”: +————+ | A | B | \0 | +————+ 然后我重新分配了缓冲区,数据中是否会丢失(甚至是单个字节)? 或者只是扩展缓冲区? : +————————+ | A | B | \0 | ? | ? | ? | +————————+ 码: #include #include #include int main(void){ char* buffer = (char*) malloc( sizeof(char) * 3 ); strncpy(buffer, “AB”, 2); buffer = (char*) realloc(buffer, sizeof(char) * 6); /* […]

现代VM如何处理内存分配?

我正在研究用C编写的简单堆栈机器,主要用于学习目的。 在使用malloc/free进行内存操作之后,我认为从现代虚拟机中读取一些特定于内存分配的代码是个好主意。 我下载了Lua源代码并开始阅读它。 过了一会儿,我意识到涉及很多宏的东西,我找不到真正的内存分配完成的代码(即malloc调用)。 find . -exec grep -i “malloc” ‘{}’ \; -print 它只打印了一些名称中包含malloc单词的Lua宏。 Lua VM(和编程语言)根本不使用malloc ! 所以这引出了一个问题:现代VM如何处理内存分配? Lua如何从堆中分配内存? 除了malloc之外,还有什么方法可以进行分配吗? 其他方法的优缺点是什么? 我也想知道安全地处理分配的内存的最佳实践,设计模式等。 我在Lua的源代码中看到,在分配内存之前有很多间接。 我在哪里可以了解这些东西?

为什么malloc内存在一个函数中并将其释放到外面是一个坏主意?

如果这是一个坏主意,如何在函数中分配内存?

如何使用mmap在堆中分配内存?

只是问题陈述,如何使用mmap()在堆中分配内存? 这是我唯一的选择,因为malloc()不是可重入函数。

realloc和malloc函数

看看代码: #include #include void main() { int *p; p = malloc(6); p = realloc(p, 10); if (p == NULL) { printf(“error”); exit(1); } } 以此示例为代码,假设总内存为10个字节,并且通过malloc函数指定类型为int和ohter 6字节的声明使用2个字节,剩余的2个字节被其他程序占用,现在当我运行realloc函数时为了扩展指针指向的内存,它将在内存中搜索10个字节,当它不可用时,它从堆区域分配10个字节的内存并复制malloc的内容并将其粘贴到堆区域中的新分配的内存区域中。然后删除存储在malloc中的内存吧? realloc()是否返回NULL指针,因为内存不可用? 没有权利!? 它确实进入堆区域进行内存分配吗? 它不会返回NULL指针吗?

我是否应该在我的C代码中检测OOM(内存不足)错误?

我已经投入了大量的C代码行来清理标签/条件失败的内存分配(由alloc系列返回NULL )。 我被告知这是一个很好的做法,因此,在内存故障时,可以标记适当的错误状态, 并且调用者可以执行“优雅的内存清理”并重试。 我现在对这个我希望清理的哲学有些怀疑。 我想调用者可能会释放过多的缓冲区空间或剥离其数据的关系对象,但我发现调用者很少有能力 (或处于适当的抽象级别)这样做。 此外, 从被叫函数提前返回没有副作用通常是非常重要的。 我刚刚发现了Linux OOM杀手,这似乎使我的主要开发平台上的这些努力毫无意义。 默认情况下,Linux遵循乐观的内存分配策略。 这意味着当malloc()返回非NULL时,无法保证内存确实可用。 这是一个非常糟糕的错误。 如果事实certificate系统内存不足,那么一个或多个进程将被臭名昭着的OOM杀手杀死。 我认为可能还有其他平台遵循相同的原则。 有没有务实的东西使得检查OOM条件值得?