gpt4 book ai didi

c - asn1c : Why do i need to free this member of this struct?

转载 作者:太空宇宙 更新时间:2023-11-04 05:24:19 25 4
gpt4 key购买 nike

目前我正在尝试了解 asn1c 编译器。我现在通读 PDF https://lionet.info/asn1c/asn1c-usage.pdf .在2.1.7 释放目标结构部分是这样的例子:

/*
1. Rectangle_t is defined within my_figure
*/
struct my_figure {
Rectangle_t rect;
} *mf = ...;

/*
* Freeing the Rectangle_t* without freeing the mf->rect area.
*/
asn_DEF_Rectangle.free_struct( &asn_DEF_Rectangle, &mf->rect, 1 /* !free */ );

我会将 rect 视为嵌入同一 block 内存中的 struct my_figure 的一部分。那么,为什么我需要用那个函数释放那个结构?当它不释放内存块时,此功能的目的是什么?

Rectangle_t 的定义如下:

RectangleTest DEFINITIONS ::= BEGIN

Rectangle ::= SEQUENCE {
height INTEGER,
width INTEGER
}

END

生成的头部

/*
* Generated by asn1c-0.9.24 (http://lionet.info/asn1c)
* From ASN.1 module "RectangleTest"
* found in "../Rectangle.asn1"
*/

#ifndef _Rectangle_H_
#define _Rectangle_H_


#include <asn_application.h>

/* Including external dependencies */
#include <INTEGER.h>
#include <constr_SEQUENCE.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Rectangle */
typedef struct Rectangle {
INTEGER_t height;
INTEGER_t width;

/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} Rectangle_t;

/* Implementation */
extern asn_TYPE_descriptor_t asn_DEF_Rectangle;

#ifdef __cplusplus
}
#endif

#endif /* _Rectangle_H_ */
#include <asn_internal.h>

最佳答案

我认为您没有正确理解 free 函数的工作原理。 free 获取指向您为结构分配的区域的指针,然后让操作系统知道它不再是分配的内存部分。例如,如果您创建一个 vector 结构:

typedef struct Vector2 {
float x,y;
} Vector2;

// Somewhere in an executing section of code for example you do this
Vector2 *vec;
vec = (Vector2*) malloc(sizeof(Vector2));

现在,正如您所说,Vector2 只是内存中某处的顺序数据(如果您想在称为 的区域中更具体)。如果你能看到它,它看起来像:

堆内存:... | float x | float y | ...

如果你想释放一个分配的 Vector2,你只需要调用传递它的指针的 free 函数:

free(vec);

这是最简单的示例,因为除了调用 free 函数之外没有更多必要的处理。那是因为 struct Vector2 没有指针!如果结构更复杂并且有一些指针,在释放空洞之前,您必须释放它的所有指针。下一个示例是列表实现,其中每个节点都指向下一个节点,直到最后一个节点指向 NULL。

typedef struct Node {
int data;
struct Node* next;
} Node;

//Returns a new node
Node* newNode(){
Node* node = (Node*) malloc(sizeof(Node));
node->next = NULL;
return node;
}

//Adds new element at tail
Node* addAtTail(Node* list){
if(list->next != NULL)
return addAtTail(list->next);

list->next = newNode();
return list->next;
}

下一个列表将如何在您的堆内存中?

Node* example_list = newNode();
addAtTail(example_list);
addAtTail(example_list);
addAtTail(example_list);

这个列表就是下面的列表:A -> B -> C -> D -> NULL

这是你的堆内存:

...{ 整数数据 |下一个节点 } ... { int 数据 |下一个节点 } ... { int 数据 |下一个节点 } ... { int 数据 |节点* 下一个 } ...

好的。如果您只调用以下代码行,您的堆内存将如何:free(example_list);example_list 是“A”节点(第一个节点),因此您将释放节点“A”!这就是您的堆内存现在的样子:

...{ ----------释放-------- } ... { 数据 |下一个节点 } ... { int 数据 |下一个节点 } ... { int 数据 |节点* 下一个 } ...

所有那些您没有释放的节点会怎样? :D

内存泄漏 是正确的术语。你内存中那些糟糕的数据没有指向它们的指针,因此它们在你的内存中永远丢失了,只是在占用空间!在大多数应用程序中,您不会注意到任何差异,但在关键和正在进行的应用程序中,拥有一个无内存泄漏的应用程序非常重要,因此保持代码不泄漏内容是非常好的做法。

也许 Rectangle_t 有一些指针需要以特殊且独特的方式释放 :) 我们示例列表的特殊释放函数如下所示:

void freeList(Node* node){
if(node == NULL)
return;
free_list(node->next);
free(node);
}

如果不调用释放结构体Node的特殊函数,就会出现内存泄漏,所以才有必要。我想这与 Rectangle_t 的原因相同

关于c - asn1c : Why do i need to free this member of this struct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38313899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com