C标准明确规定,编译器/库组合可以随意处理以下代码:
int doubleFree(char *p)
{
int temp = *p;
free(p);
free(p);
return temp;
}
如果编译器不需要使用特定的捆绑库,那么C标准中是否有任何禁止库定义有意义行为的规定呢?以一个简单的例子来说,假设代码是为一个具有引用计数指针的平台编写的,这样,在执行
p = malloc(1234); __addref(p); __addref(p);
之后,前两个对free(p)
的调用将会减少计数器但不会释放内存。 任何为使用这种库编写的代码自然只能与此类库一起使用(在大多数其他库上,__addref()
调用可能会失败),但在许多情况下这种功能可能很有帮助,例如当需要重复将字符串传递给期望接收使用strdup
生成并随后调用free
的字符串的方法时。如果某个库定义了双重释放指针等操作的有用行为,那么在C标准中是否有任何授权编译器单方面打破它的规定呢?