考虑一个多次调用malloc()free()的应用程序.例如,该应用程序总共分配malloc()0字节.

我正在try 编写一段代码,通过分割一个大的错误锁定内存,然后释放它来减少malloc/free调用的数量:

#include <stdio.h>
#include <stdlib.h>

struct A
{
    char *s;
    int data;
};

struct B
{
    float len;
    char net;
    int data[];
};

struct C
{
    float len;
    char net;
    int data[10];
    struct B *b;
}; 

int main() {
    int s =0;
    char *p = malloc(1000);
    char *mem = p;
    //Alocate for struct A from above pool
    struct A *a = (struct A *)p;
    p += sizeof(struct A);
    struct B *b = (struct B *)p ;
    p += sizeof(struct B) + sizeof(int) * 3; //data[0]..data[2]
    struct C *c = (struct C *)p;
    free(mem);
    return 0;
}

对于我的问题,这是合法的方法吗?我的代码或场景中是否有任何我遗漏并可能导致问题的缺陷?

推荐答案

听起来你想要的是arena allocator,在某些情况下这是非常正常的技巧.

一旦您修复了对齐问题,并将您的代码组织成一个精心设计和自包含的stage,您就会发现

  • 它不能修复或轻松处理碎片化.因此,根据您的分配模式,最终可能会使用更多的整体内存

  • 这并不会使将分配与解除分配正确匹配变得更容易(或更难)

  • 它确实允许你一次释放(或重置)整个竞技场,所以任何丢失的移位都不会造成永久性的泄漏.

    (它们仍然是暂时的泄漏,因为它们增加了重置之间竞技场的压力和碎片化)

有时,完全不担心重新分配是有意义的,直到重置.这绕过了前两点,但它是否可接受完全取决于您的分配模式(以及您可以浪费多少内存).

知道这项技术的名称,应该很容易找到工作示例.

C++相关问答推荐

理解没有返回语句的递归C函数的行为

va_copy的使用是未定义的行为吗?

有没有更简单的方法从用户那里获取数据类型来计算结果

GCC预处理宏和#杂注GCC展开

如何知道我是否从非阻塞套接字读取所有内容

C中的指针增量和减量(*--*++p)

在 struct 中强制转换空指针

函数内的局部字符指针

如何使用libgpio(d)为Raspberry Pi编译C程序?

C堆栈(使用动态数组)realloc内存泄漏问题

是否定义了此函数的行为?

错误...的多个定义(&Q)首先在这里定义&

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

为什么我的旧式&q;函数在传递浮点数时会打印2?

分配给静态变量和动态变量的位置之间有区别吗?

C语言中的指针和多维数组

如何不断地用C读取文件?

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

如何确定 C 程序中的可用堆内存