避免释放字符串文字

时间:2015-09-19 03:32:32

标签: c malloc free

如果你在C中有一个函数来获取传递给它的任何东西的所有权,比如一个函数将struct添加到矢量缓冲区的值,并且这个struct值包含一个指向a的成员指针字符数组(字符串)。

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

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

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
    }
}

1 个答案:

答案 0 :(得分:2)

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

如果允许多个指针指向同一个对象(想想图形数据结构),那么根据您的观点,事情会变得更加复杂或有趣。为此,您可能需要一个垃圾收集方案:obstacks,引用计数,标记和扫描,竞技场复制等。其他语言倾向于为您提供其中一种作为内置或(如在C ++中)语言故意意图支持自己实现一个或多个。用C,而不是......