Tag: 内存管理

Python C模块 – Malloc在特定版本的Python中失败

我正在编写一个Python模块来在O_DIRECT上下文中执行IO。 O_DIRECT的一个限制是你必须读入对应于2.4和2.5内核的4096字节边界的缓冲区,2.6及以上将接受512的任意倍数。 显而易见的内存分配候选是posix_memalign(void **memptr, size_t alignment, size_t size) 在我的代码中,我分配了一个像这样的区域: char *buffer = NULL; int mem_ret = posix_memalign((void**)&buffer, alignment, size); if (!buffer) { PyErr_NoMemory(); return NULL; } /* I do some stuff here */ free(buffer); 当我用python3.2编译和导入模块时,这个(以及未示出的模块的其余部分)工作正常。 当我尝试使用python2.7(我想保持兼容性)时,它会抛出PyErr_NoMemoryexception,而mem_ret == ENOMEM表示它无法分配。 为什么我编译的Python版本会影响posix_memalign的运行方式? 操作系统:Ubuntu 12.04 LTS 编译器:Clang + GCC显示相同的行为 UPDATE 感谢user694733,我现在有了一段代码 然而它工作的事实让我更加困惑: #if PY_MAJOR_VERSION >= 3 char *buffer = […]

为什么free()只将8个第一个字节设置为零?

我有一个关于free()行为的问题。 Juste一个使用malloc和strcpy char *的简单代码。 所以,所有都是在HEAP上设置的: (gdb) x/100b 0x602010 0x602010: 66 111 110 106 111 117 114 32 0x602018: 116 111 117 116 32 108 101 32 0x602020: 109 111 110 100 101 0 0 0 0x602028: 0 0 0 0 0 0 0 0 0x602030: 0 0 0 0 0 0 0 0 0x602038: 33 […]

为什么全局变量存储在堆中?

为什么在以下示例中,全局变量存储在堆段中,而不是数据/ bss段? 从map伪文件的以下输出中,data / bss段是第3行。 这是因为它是读/写和匿名的。 以下2个条目是堆(如标签所示)。 这是/ proc // maps的输出: 00400000-00405000 r-xp 00000000 08:02 17962770 myexec 00604000-00605000 r–p 00004000 08:02 17962770 myexec 00605000-00606000 rw-p 00005000 08:02 17962770 myexec 00606000-00607000 rw-p 00000000 00:00 0 [heap] 00607000-00642000 rw-p 00000000 00:00 0 [heap] 7ffff7a15000-7ffff7bd0000 r-xp 00000000 08:02 22282470 ..libc2.19.so 7ffff7bd0000-7ffff7dcf000 —p 001bb000 08:02 22282470 ..libc-.19.so 7ffff7dcf000-7ffff7dd3000 r–p […]

如何检测进程CPU /内存使用情况并在超过某个值时将其终止?

我正在学习c / c ++,我想知道是否可以通过它的名称来检测进程,并在它的cpu /内存使用率超过某个值时终止它。 我会对实际代码提供任何帮助,或者只是指向正确的方向。

“释放的指针未被分配”内存块由于某种原因不会解除分配

我很难找到为什么我不能释放内存块。 指针必定有问题。 用于结构的存储器块在函数中进行,并且所使用的指针存储在数组中。 稍后,从数组中取出指针以释放内存。 我已经弄清楚它是免费的。 我把“//这一个”放在旁边。 #include typedef enum { INT = 0, FLOAT = 1, STRING = 2, NONE = 3, BOOL = 4 } TYPE; typedef struct { TYPE type; void * data; } Variable; typedef Variable ** var; //Convenience typedef for pointer to variable pointer typedef struct { size_t size; Variable *** […]

理解指针的目的

我正在读一本关于数据结构的书,并且难以掌握指针的概念。 让我先说一下我对C没有很多经验。但是这里…… 如果我执行以下操作: int num = 5; int *ptrNum; ptrNum = # 我的理解是指针为32位int保留了足够的内存以及实际指针所需的内存,尽管它的值只是变量的内存地址。 如果保留相同数量的内存,这样做的目的是什么? 为什么我会使用指针而不是变量num? 我完全不在这里吗?

我怎么知道c中指针变量的分配内存大小

在这种情况下,我遇到了一些问题,请问你的想法。 main() { char *p=NULL; p=(char *)malloc(2000 * sizeof(char)); printf(“size of p = %d\n”,sizeof (p)); } 在这个程序中它打印4个(char *)值,但我需要分配多少字节。

如何获取指针指向的内存大小?

我目前正在研究NUMA机器。 我正在使用numa_free来释放我分配的内存。 但是,与free不同, numa_free需要知道要释放多少字节。 有没有办法知道指针指向多少字节而不追踪它?

free将不会删除分配给指针的内存(int数组),使用免费的两次工作,为什么?

这是出于好奇,我试图在以前的问题上找到我怀疑的答案,但他们似乎没有答案。 所以问这里,我刚写了一个代码,我试图将内存分配给一个int指针(填充数组)并将int值扫描给它。 完成数组后,我想删除分配给指针的数据/内存。 虽然我的代码工作得很好,但是为什么我仍然可以在释放指针之后看到int数组中的值。 然而,如果我使用两次免费它会引发错误(这是在单次使用免费后预期的)。 这不是一个奇怪的行为吗? 我在我的Mac上尝试使用Xcode也在codechef,同样的行为,为什么? int *num=(int *)malloc(n*sizeof(int)); int i; for(i=0;i<n;i++) { scanf("%d",&num[i]); } for(i=0;i<n-1;i++){ temp = some_function(x); } free(num); for(i=0;i<n;i++) { printf("\nnum[%d]= %d\n",i,num[i]); } 上面的代码打印num []内的值,理想情况下它不应该。

使用mingw32对posix_memalign的未定义引用

我正在使用Debian Squeeze,使用mingw32交叉编译windows目标。 对于Linux目标,我可以使用posix_memalign来分配对齐的内存。 我似乎无法找到一种方法让它适用于Windows目标; 我收到有关未定义引用的错误。 我尝试了几种替代function,但无济于事。 示例代码: #include #include #include int main(void) { char *foo; /* works on linux */ posix_memalign(&foo, 1024, 1024); /* deprecated linux */ memalign(1024, 1024); valloc(1024); /* should work on windows only */ _aligned_malloc(1024, 1024); } Linux目标的示例输出(预期): ben@debian6400:~/folder$ gcc –version gcc (Debian 4.4.5-8) 4.4.5 ben@debian6400:~/folder$ gcc -std=c99 test.c test.c: In function […]