Tag: 内存管理

何时为局部变量分配堆栈空间?

我对以下C代码有疑问: void my_function() { int i1; int j1; // Do something… if (check_something()) { int i2; int j2; // Do something else… } // Do some more stuff… } 是否有关于何时为i2和j2分配/解除分配堆栈空间或是否依赖于编译器的保证? 我希望当i2和j2进入范围时调整堆栈指针,并在它们超出范围时进行调整,但后来认为某些编译器可能只是“优化”整个事物并在嵌套范围内考虑变量。首先输入该function。 我知道我可以查看我的编译器生成的汇编代码,但是想知道实现是否可以留给编译器。 谢谢!

堆栈内存是否有限制?

我正在经历其中一个主题。 一个程序崩溃了,因为它在函数内部声明了一个10 ^ 6的数组。 给出的原因是堆栈上的内存分配失败导致崩溃。 当全局声明相同的数组时,它运行良好。(堆上的内存保存了它)。 现在,让我们假设,堆栈向下增长并向上堆积。 我们有: – -堆 – – ——————- – -堆 – – 现在,我相信如果堆栈上的分配失败,它也必须在堆上失败。 所以我的问题是:堆栈大小有限制吗? (超过限制导致程序崩溃)。 或者我错过了什么?

了解堆栈分配和对齐

我试图理解堆栈对齐是如何工作的,如什么是“堆栈对齐”? 但我很难得到一个小例子来certificate上述行为。 我正在检查我的函数foo的堆栈分配: void foo() { int a = 0; char b[16]; b[0] = ‘a’; } 我使用gcc -ggdb example.c -o example.out编译源文件(即没有任何编译器标志),并且gdb中的汇编器转储读取: (gdb) disassemble foo Dump of assembler code for function foo: 0x08048394 : push %ebp 0x08048395 : mov %esp,%ebp 0x08048397 : sub $0x20,%esp 0x0804839a : movl $0x0,-0x4(%ebp) 0x080483a1 : movb $0x61,-0x14(%ebp) 0x080483a5 : leave 0x080483a6 […]

操作内存时是否需要乘以sizeof(char)?

当使用malloc并进行类似的内存操作时,我可以依赖sizeof(char)始终为1吗? 例如,我需要为char类型的N个元素分配内存。 是否需要乘以sizeof( char ) : char* buffer = malloc( N * sizeof( char ) ); 或者我可以依赖sizeof(char)始终为1并且只是跳过乘法 char* buffer = malloc( N ); 我完全理解在编译期间评估sizeof然后编译器甚至可以编译出乘法,因此性能损失将是最小的并且很可能为零。 我主要询问代码清晰度和可移植性。 char类型是否需要这种乘法?

如何分析C程序的内存使用情况

我需要弄清楚我正在运行的linux程序的哪个部分,占用了多少(百分比或绝对值)内存。 我需要创建一个包含多个这样的程序的配置文件,以便我可以在我的代码中识别出一些更大的内存使用者,并看看我是否可以优化它们以减少使用。 我需要它在MIPS平台上,不幸的是,Valgrind不适用于MIPS。 任何帮助/指针将不胜感激。

包装malloc – C.

我是C的初学者。在阅读git的源代码时,我发现了围绕malloc这个包装函数。 void *xmalloc(size_t size) { void *ret = malloc(size); if (!ret && !size) ret = malloc(1); if (!ret) { release_pack_memory(size, -1); ret = malloc(size); if (!ret && !size) ret = malloc(1); if (!ret) die(“Out of memory, malloc failed”); } #ifdef XMALLOC_POISON memset(ret, 0xA5, size); #endif return ret; } 问题 我不明白为什么他们使用malloc(1) ? release_pack_memory做了什么,我在整个源代码中找不到这个函数实现。 #ifdef XMALLOC_POISON memset(ret, […]

分段故障如何在内部工作(内核/硬件)?

从广义上讲,我想知道内核(或CPU)如何知道进程试图访问它缺少权限的内存位置,以及称为MMU的神秘硬件如何帮助实现这一点。 特别是:在我看来,MMU对操作系统内核的内存管理模型(分页,内存区域,进程地址空间……)是不可知的(我认为Linux和Windows页面不完全相同,因为例如,如果我错了,请纠正我。 但是,我的CPU如何确定当前代码是否可以访问位置x ? 它如何向内核发出信号?

函数内的字符串文字:自动变量还是在堆中分配?

我们在里面使用的字符串文字是自动变量吗? 或者它们是否在堆中分配,我们必须手动释放? 我的情况类似于下面显示的代码,其中我将字符串文字分配给类的私有字段(在代码中标记为ONE),并在稍后的程序中检索它并使用它(标记为TWO)。 我是否将堆栈中的变量分配给ONE中的字段? 代码是否可以引用悬空指针,在这种情况下,因为程序足够小,所以可以工作? 我已编译并运行它,它工作正常,但我在我的实际程序中遇到了一个奇怪的崩溃,我将字符串文字分配给类的字段,我怀疑上面提到的情况。 #include using namespace std; class MemoryLeak { private: char *s; public: MemoryLeak() {} void store() { s = “Storing a string”; // ONE } char *retrieve() { return s; } }; int main() { MemoryLeak *obj = new MemoryLeak(); obj->store(); cout <retrieve() << endl; // TWO delete obj; return […]

Malloc分配的内存多于RAM

我刚刚在一台12 MB的机器上执行了一个mallocs 13 MB的程序(QEMU Emulated!)。 不仅如此,我甚至浏览了记忆并填充了垃圾…… void large_mem(void) { #define LONGMEM 13631488 long long *ptr = (long long *)malloc(LONGMEM); long long i; if(!ptr) { printf(“%s(): array allocation of size %lld failed.\n”,__func__,LONGMEM); ASSERT(0); } for(i = 0 ; i < LONGMEM ; i++ ) { *(ptr+i)=i; } free(ptr); } 这怎么可能 ? 我期待一个分段错误。

使用三重指针将内存分配给3D数组

我必须使用三指针将内存分配给3D数组。 #include int main() { int m=10,n=20,p=30; char ***z; z = (char***) malloc(sizeof(char**)*m*n*p); return 0; } 这是正确的做法吗?(我认为我所做的是不正确的。)