如果在C一個函數,無論傳遞到它,諸如,增加了一個struct
由-值的向量緩衝區的功能的所有權,並且該結構值包含一個成員的指針一個字符數組(一個字符串)。避免釋放字符串文字
在緩衝區的清理程序,它應該釋放它擁有的字符串,但如果某些字符串在運行時分配的,但是別人都在用字符串常量在編譯時分配的。
沒有安全和標準(非專有)的方式來檢測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
}
}
你的元素結構需要一個標誌,讓你知道你是否能釋放該名與否。 –
@AlexisWilke很好,是的,但我想知道是否有更好的方法。 – Dai
有專有的方法可以知道指針是在堆中還是在啓動數據中,但它可能比較慢(在Unix下,它只是一個指針比較,但Windows需要API調用......)因爲你說「非-proprietary」 ... –