类型和内存

2024-05-17 19:08:41 发布

您现在位置:Python中文网/ 问答频道 /正文

试验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之后和脚本结束之前没有空闲的内存?在


Tags: freeforreturnincludestructintbtsuint32
3条回答

在Linux系统中,进程永远不会把内存还给操作系统,只有在它们停止的时候。这就是为什么你看不到内存被释放的原因。在

它适用于Windows(gcc 4.5.3):

import os
m = bts_initialize()
os.system('tasklist /fi "imagename eq python.exe"')
bts_free(m)
os.system('tasklist /fi "imagename eq python.exe"')

输出:

^{pr2}$

正如Adam Rosenfield所说,您的结构应该有一个ctypes.c\uulonglong,但这只是正确访问它的问题。我不知道为什么你的图书馆没有释放内存。不过,一般来说,我认为应该让调用者分配内存并让库初始化它。在

另外,使用m = bts_pointer()创建bts_指针并立即将m重新分配给一个带有m = bts_initialize()的新对象也没有任何作用。您可以删除第一个分配。在

编辑:

研究使用mallopt来优化堆和mmap上内存的分配和释放,特别是参数M_TRIM_THRESHOLD和{}。可能对默认值进行了优化,以最小化与调用brksbrk等相关的系统调用开销

这可能不是您唯一的问题,但是ctypes类型c_ulong对应于C类型unsigned long,它只有32位。您应该使用c_ulonglong,它是64位。在

相关问题 更多 >