【发布时间】:2014-06-01 10:27:04
【问题描述】:
我目前正在 C 语言中滚动我自己的 split、trim 和其他实用字符串函数。
在翻找 SO 时,我确定像 strdup() 这样的函数是,在
一般,被认为是邪恶的,因为它分配内存(与其他字符串函数不同
来自同一个库)。
但是,我的函数可以以不分配内存的方式编写,这似乎是不可避免的。我正在尽我所能解决这个问题。目前,我已经留下了所有的输入 单独的字符串(const),并返回一个指向新字符串的指针并记录 return 必须稍后释放。
我正在考虑是否有更好的方法,这个想法让我印象深刻。我试图弄清楚这实际上是一个好主意还是一个幼稚的主意。这就是我的问题,是 以下解决方案建议?如果没有,怎么会?
我的想法是这样的,我将创建一个这样的结构:
typedef struct string {
char *str;
bool initialized;
} string;
将它用于我所有的字符串操作工作。在所有相关功能的最后,只需
在 return 语句之前,我将在输入字符串(不是 char 指针而是上述结构)上调用另一个函数,我们称之为 destroy。该函数反过来会检查布尔值ìnitialized,它表示
内存已分配,如果是,则随后释放它。
【问题讨论】:
-
如果从对字符串函数的评估中,你觉得
strdup()是被认为是邪恶的,那么你一直在做一个奇怪的评估。 -
strdup()并不像strcpy()那样邪恶。strcpy()的问题在于它可以轻松覆盖未分配的内存(从而破坏堆栈并允许在您的软件中利用漏洞)。人们不喜欢strdup(),因为它打破了malloc-free模式,但它不被认为是邪恶的。但是你需要分配字符串,因为你不知道你需要的字符串会有多长。此外,您真的不需要为所有这些烦恼。只需将字符串设置为NULL... 即可确保free和realloc之类的内容忽略它,并且它比您的结构简单得多。 -
我真的不明白你关心的是什么。您能否添加一个代码示例,说明您尝试使用结构解决的问题
标签: c string pointers memory-management struct