Tag: 内存管理

为什么你想要在堆而不是堆栈上分配内存?

可能重复: 何时最好使用堆栈而不是堆,反之亦然? 我已经阅读了关于堆与堆栈的其他一些问题,但它们似乎更关注堆/堆栈的作用而不是使用它们的原因。 在我看来,堆栈分配几乎总是首选,因为它更快(只需移动堆栈指针而不是在堆中查找空闲空间),并且在完成使用后不必手动释放已分配的内存。 我可以看到使用堆分配的唯一原因是,如果要在函数中创建对象,然后在函数作用域之外使用它,因为堆栈分配的内存在从函数返回后自动取消分配。 是否有其他原因使用堆分配而不是我不知道的堆栈分配?

Alloca实施

如何在D,C和C ++等语言中使用内联x86汇编程序实现alloca()? 我想创建一个稍微修改过的版本,但首先我需要知道标准版本是如何实现的。 从编译器中读取反汇编并没有帮助,因为它们执行了很多优化,我只想要规范forms。 编辑:我想困难的部分是我希望它具有正常的函数调用语法,即使用裸函数或其他东西,使它看起来像普通的alloca()。 编辑#2:啊,到底是什么,你可以假设我们没有省略帧指针。

如果我尝试访问malloc()区域以外的内存会发生什么?

我用char* memoryChunk = malloc ( 80* sizeof(char) + 1);分配了一个内存char* memoryChunk = malloc ( 80* sizeof(char) + 1); 是什么阻止我写入超过81个单元的内存位置? 我该怎么做才能防止这种情况发生? void testStage2(void) { char c_str1[20] = “hello”; char* ut_str1; char* ut_str2; printf(“Starting stage 2 tests\n”); strcat(c_str1, ” world”); printf(“%s\n”, c_str1); // nothing exciting, prints “hello world” ut_str1 = utstrdup(“hello “); ut_str1 = utstrrealloc(ut_str1, 20); utstrcat(ut_str1, c_str1); […]

检查指针是否指向堆上已分配的内存

我想知道指针是否指向一个用malloc / new分配的内存。 我意识到任意地址的答案是“不,你不能”,但我认为可以覆盖malloc / free并跟踪分配的内存范围。 您是否知道提供此特定工具的内存管理库? 你知道生产代码的东西吗? Valgrind很棒,但是仪表太多了(慢)并且Will说我们不想像这样使用Valgrind(使软碰撞变得足够好)。 Mudflap是一个非常好的解决方案,但是专门用于GCC,遗憾的是,检查不会简单地返回布尔值(请参阅下面的答案)。 请注意,检查内存写入是否合法是一个安全问题 。 所以寻找表现是有动力的。