gpt4 book ai didi

c - 构建一个C不可变字符串库,如何处理剩余的const char*?

转载 作者:行者123 更新时间:2023-12-04 05:12:52 24 4
gpt4 key购买 nike

在 C 中处理字符串肯定会让人希望使用一种简单的基于类的语言,但我正在尝试构建一个方便的字符串库。我的想法是使用不可变字符串,结构名为 Rstring (对于“健壮的字符串”)具有内部 const char* sint length , 这样的操作像 rstring_concatrstring_substring返回新 Rstring拥有自己的新对象malloc 'd 字符指针。

编写库的初稿,我对使用我的库而不是 char * 的简单性和清洁性感到满意.然而,我意识到返回一个新分配的指针有点像没有析构函数的 PITA。每次执行某些操作时,例如通过连接或子字符串,您都有一些新分配的内存,然后您之前拥有的任何字符串现在都挂了,并且可能没用,所以它们需要是 free 'd,而 C 没有析构函数,因此用户不得不手动绕过 free一切。

因此我的问题是,有没有什么聪明的方法可以避免手动调用 free 呢?例如,可能有内部 startend索引以使字符串像小字符串一样起作用,但实际上包含更多?我不知道是否有任何普遍接受的方法可以做到这一点,或者人们是否只是被 C 中繁琐的内存管理所困。

也许最好的是,是否有任何广泛使用的库可以在 C 中方便地进行字符串操作?

最佳答案

如果您需要更好的 C 字符串库,我会推荐 The Better String Library .

C 没有任何方法可以简化内存管理。您使用 malloc 分配的任何内存都必须被释放。如果您在一个函数中处理大量字符串,您可以使用特殊的 registry您将字符串注册到的位置。然后注册表可以销毁所有注册到它的字符串。

例如(只有接口(interface),没有实现)

void rstring_reg_init(rstring_reg*);
void rstring_reg_destroy(rstring_reg*);
rstring rstring_reg_create(rstring_reg*, const char*);
void rstring_reg_register(rstring_reg*, rstring);
void rstring_reg_detach(rstring_reg*, rstring);

如果您的字符串是可变的,您甚至可以使用注册表创建字符串(我宁愿将其称为池)。如果字符串要记住它们的池,您甚至可以让它们在创建时注册自己。这可能会导致相当“漂亮的代码”,例如:
rstring f() {
rstring_reg reg;
rstring_reg_init(&reg);
rstring a = rstring_reg_create(reg, "foo");
rstring b = rstring_reg_create(reg, "bar");
rstring ab = rstring_concat(a, b);
rstring s = rstring_substr(ab, 1, 4);
rstring_detach(s);
rstring_reg_destroy(&reg);
return s;
}

这段代码的作用是:
  • 创建注册表
  • 创建 ab都知道注册表的字符串
  • 新建ab字符串。它会自动添加到注册表中。
  • 新建s字符串。它也被添加到注册表中。
  • 分离 s从注册表中,因为我们要返回它。
  • 销毁注册表。这会自动销毁 a , bab
  • 返回 s - f 的调用者现在负责管理它的内存


  • 最后,我宁愿推荐使用 C++ 而不是使用这种野兽。

    你真正想要的是 RAII这只能使用 C++ 或专有的 GCC 扩展来实现。

    关于c - 构建一个C不可变字符串库,如何处理剩余的const char*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668679/

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