我正在编写一个对文本进行标记并基于标记化对其进行转换的程序。标记由结构表示:
struct token {
enum token_type type;
size_t length; /* as returned by strlen(token.text); */
char text[]; /* 0-terminated */
};
标记器提供了一个迭代器接口,该接口在调用时分配并产生下一个标记。然后,该函数的调用者处理该令牌,将其传递给几个函数(其中一些可能自行存储该令牌)并可能将其存储在某处。
在某个时间点,令牌处理完成并且可以释放所有令牌。
我应该如何继续跟踪代币的分配?
我对此有三个想法:
每个令牌都包含一个指向前一个令牌的指针;最后,我可以简单地遍历链表来释放所有令牌。一旦我在多个地方创建令牌,这就会变得复杂。
每个令牌都包含一个引用计数器。这很复杂,因为我需要密切注意我保留对令牌的引用的位置。
每个函数都复制标记而不是保留对它们的引用。如果一个函数作为参数传递了一个标记,它不能保留它们。这可能会导致大量不必要的内存分配。
如果能从更有经验的程序员那里得到一些信息,那就太好了。