试验c:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXFRAGMENTS 4000000
typedef struct {
uint64_t FirstFragmentTimestamp;
} fragment_t;
typedef struct {
fragment_t** fragments;
} bts_t;
bts_t* initialize() {
uint32_t i;
bts_t* bts;
bts = (bts_t *) malloc(sizeof(bts_t));
bts->fragments= (fragment_t **) malloc(sizeof(bts_t *)*MAXFRAGMENTS);
for(i=0;i<MAXFRAGMENTS;i++) {
(bts->fragments)[i]=(fragment_t *) malloc(sizeof(fragment_t));
(bts->fragments)[i]->FirstFragmentTimestamp = 0;
}
return bts;
}
int fr(bts_t *bts)
{
uint32_t i;
if ( bts != NULL ) {
for(i=0;i<MAXFRAGMENTS;i++) {
free(bts -> fragments[i]);
}
free(bts->fragments);
}
free(bts);
return 1;
}
int main() {
}
在测试.py公司名称:
^{pr2}$为什么顶部显示,运行bts_free之后和脚本结束之前没有空闲的内存?在
在Linux系统中,进程永远不会把内存还给操作系统,只有在它们停止的时候。这就是为什么你看不到内存被释放的原因。在
它适用于Windows(gcc 4.5.3):
输出:
^{pr2}$正如Adam Rosenfield所说,您的结构应该有一个ctypes.c\uulonglong,但这只是正确访问它的问题。我不知道为什么你的图书馆没有释放内存。不过,一般来说,我认为应该让调用者分配内存并让库初始化它。在
另外,使用
m = bts_pointer()
创建bts_指针并立即将m
重新分配给一个带有m = bts_initialize()
的新对象也没有任何作用。您可以删除第一个分配。在编辑:
研究使用mallopt来优化堆和mmap上内存的分配和释放,特别是参数}。可能对默认值进行了优化,以最小化与调用
M_TRIM_THRESHOLD
和{brk
、sbrk
等相关的系统调用开销这可能不是您唯一的问题,但是ctypes类型
c_ulong
对应于C类型unsigned long
,它只有32位。您应该使用c_ulonglong
,它是64位。在相关问题 更多 >
编程相关推荐