【问题标题】:C: Memory allocation - Is the following struct a naive workaround?C:内存分配 - 以下结构是天真的解决方法吗?
【发布时间】: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 ... 即可确保 freerealloc 之类的内容忽略它,并且它比您的结构简单得多。
  • 我真的不明白你关心的是什么。您能否添加一个代码示例,说明您尝试使用结构解决的问题

标签: c string pointers memory-management struct


【解决方案1】:
typedef struct string {
    char *str;
    bool initialized;
} string;

该函数反过来会检查布尔值ìnitialized,它表示内存已被分配,如果是则随后释放它。

您不需要结构来执行此操作。使用空指针初始化您可能想要使用您的结构的任何 char* 指针,您可以将其传递给 free()realloc() 而不必怀疑它是否已被进一步分配。

【讨论】:

  • 但是如何使用它来保存指向字符串常量的指针呢?
猜你喜欢
  • 2018-05-20
  • 2021-05-12
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多