gpt4 book ai didi

c - ANSI C - 使用动态数组创建的嵌套 BER TLV 元素的释放

转载 作者:行者123 更新时间:2023-11-30 17:58:51 24 4
gpt4 key购买 nike

要构建嵌套 TLV 元素(例如 6F1A840E315041592E5359532E4444463031A5088801025F2D02656E),我使用以下数据结构:

typedef struct Element
{
int16_t nTag; // Tells you if pValue points to a primitive value or constructed one
uint16_t nLength;
void *pValue; // Could be either unsigned char* or TlvElement*
} TlvElement;

如何实现一个函数来正确释放嵌套 TLV 元素使用的内存?

// Let's build TLV data: 6F04A5020000
TlvElement *pTlvElement = (TlvElement*)malloc(sizeof(TlvElement));
pTlvElement->nTag = 0x6F;
pTlvElement->nLength = 4;
pTlvElement->pValue = malloc(sizeof(TlvElement)); // pValue points to another TLV element

TlvElement *pTlvElementChild = (TlvElement*)pTlvElement->pValue;
pTlvElementChild->nTag = 0xA5;
pTlvElementChild->nLength = 2;
pTlvElementChild->pValue = malloc(2 * sizeof(unsigned char)); // pValue points to a byte array
memset(pTlvElementChild->pValue, 0, 2);

Deallocate(pTlvElement);

//free(pTlvElementChild->pValue);
//free(pTlvElement->pValue);
//free(pTlvElement);

最佳答案

您只需按照注释行中给出的顺序释放它即可:

free((TlvElement *)(pTlvElement->pValue)->pValue);
free(pTlvElement->pValue);
free(pTlvElement);

函数free(void *)采用一个void *,因此编译器不会提示。您唯一需要的转换是访问子元素的字段 pValue

请注意:除非标签已经标记了这一点,否则您可能会考虑在元素确实包含子元素的地方添加 keep 。

假设 ->nTag 字段的值可用于此,您可以递归地取消分配子元素:

void Deallocate(TlvElement *e)
{
if (e->nTag == 0x6f)
Deallocate((TlvElement *)e->pValue);
else
free(e->pValue)
free(e);
}

不过,您可能需要采取预防措施来防止无限递归。

关于c - ANSI C - 使用动态数组创建的嵌套 BER TLV 元素的释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11940808/

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