c - 避免释放字符串文字

标签 c malloc free

如果您在 C 中有一个函数,它获取传递给它的任何内容的所有权,例如将 struct 按值添加到 vector 缓冲区的函数,并且此结构值包含一个成员指向字符数组(字符串)的指针。

在缓冲区的清理例程中,它应该释放它拥有的字符串,但是如果某些字符串是在运行时分配的,而其他字符串是在编译时使用字符串文字分配的,该怎么办。

没有安全和标准(非专有)的方法来检测 char* 是否指向只读内存,那么这个假设的 freeVector 函数是什么用指向字符缓冲区的指针做什么?

struct Element {
    int   id;
    char* name;
}

struct Vector {
    size_t maxIndex;
    size_t length;
    struct Element buffer[];
}

void addToVector(struct Vector* vector, struct Element element) {
    // lazy-reallocation logic here if maxIndex => length
    vector->buffer[ vector->maxIndex++ ] = element; // by-value copy
}

void freeVector(struct Vector* vector) {
    for(size_t i = 0; i < vector->maxIndex; i++ ) {
        free( vector->buffer[ i ].name ); // segfault/AV if name is a literal
    }
}

最佳答案

C 的祝福和诅咒是它让这完全取决于你。两种选择是在堆上分配所有内容并定义一个胖指针类型,其中包含一个位来说明每个实例是否需要释放。一个聪明但不可移植的实现可能会使用指针本身的低阶位,因为对于许多体系结构,所有指针的底部 2 位或更多位始终为零。垃圾收集器几乎一直使用这个技巧来区分指针和未装箱的离散类型(fixnum 在商业中)。

如果您允许多个指针指向同一对象(想想图形数据结构),那么事情会变得更加复杂或有趣,具体取决于您的观点。为此,您可能需要一个垃圾收集方案:障碍、引用计数、标记和清除、竞技场复制等。其他语言往往会故意为您提供其中之一作为内置或(如在 C++ 中)语言功能旨在支持自己实现一个或多个。使用 C,没那么多...

关于c - 避免释放字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32663893/

相关文章:

c++ - 显示系列和输入位数,如果...输入 n=900,则输出将为 1 4 9 25 49 121 169 289 361 529 841 并且计数 =3

c - 用 mpz_t 制作帕斯卡三角形

c - %g 浮点表示的最大字符串长度是多少?

c - 在 C 中是否有调用堆栈转储的函数?

c++ - Eclipse:GNU 工具链 - 使用 g++ 编译的 C 文件,重复 GNU C

c - malloc() 函数分配的内存的生命周期

c - 尝试在 C 中的 vector 中分配内存时出现奇怪的错误

Azure DevOps - 是否可以在免费套餐中添加服务连接?

c - 释放/解除分配缓冲区时出现段错误

c - 释放非 malloc 的内存