繁体   English   中英

通过在函数中传递指针来创建结构实例而分配的C / malloc函数/空间

[英]C / malloc function / space allocated by passing a pointer in a function to create an instance of structure

我有一个关于在此站点中处理的示例的问题( 定义一个返回结构指针的函数 ):

    struct Person {
    char *name;
    int age;
    int height;
    int weight;
};

struct Person *Person_create(char *name, int age, int height, int weight)
{
    struct Person *who = malloc(sizeof(struct Person));
    assert(who != NULL);

    who->name = strdup(name);
    who->age = age;
    who->height = height;
    who->weight = weight;

    return who;
}

对于32位MCU,“sizeof(struct Person)”执行的大小为16字节(指针为4个字节,4个字节为3个整数)。 因此,“malloc”函数在RAM中为结构“Person”的新实例分配16个字节。 但实际上,当我们对“Person”进行修饰时,真正用于“Person”实例的空间是不同的,可能更重要,这取决于“name”参数的长度。

问题:“malloc”函数分配的大小与“Person”实例的实际大小之间的差异可能是个问题吗?

最好的祝福。

strdup函数自己调用malloc来分配字符串,因此字符串最终位于需要单独释放的独立内存块中。 你可以改为:

struct Person *Person_create(char *name, int age, int height, int weight)
{
    struct Person *who = malloc(sizeof(struct Person) + strlen(name) + 1);
    assert(who != NULL);

    who->name = (char *)(who + 1);
    strcpy(who->name, name);
    who->age = age;
    who->height = height;
    who->weight = weight;

    return who;
}

这将为struct Person和name字符串分配一个具有足够空间的块。 这样,您只需要一次free通话即可释放整个内容。

首先,Chris Dodd给出的解决方案非常聪明,但IMO无法维护,我不会让这些代码在任何项目中通过审核。

其次, Person大小和总数据大小的差异本身不是问题,但您必须了解解除分配的工作原理。

如果你在Person*上调用free() ,你最终会发生内存泄漏。 free()是哑的:它只会解除分配与Person*相关的内存块,而且它不知道应该释放的任何其他相关资源(在你的情况下: Persion::name )。

我建议复制C ++构造函数/析构函数idom:

  1. Person_create()函数正在创建对象。
  2. void Person_delete(Person *p)应该释放name并且只能释放Person内存。

在C ++中,我们使用operator delete在释放对象/结构占用的内存区域之前调用析构函数。 析构函数的工作是确保在删除内存区域之前释放对象持有的所有资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM