我正在尝试释放指向易失性缓冲区的指针(指针不是易变的[我认为......])
void try_this(volatile int* vint)
{
free(vint);
}
给了我:
警告:传递'free'的参数1从指针目标类型中删除限定符
这似乎提供了一个适用于释放的解释:int * volatile vint
http://lists.freebsd.org/pipermail/freebsd-hackers/2005-January/009652.html
似乎暗示因为指针可能指向无效内存(因为它是易失性的,它可能在程序/线程的正常流程之外发生了变化),这就是为什么不鼓励这种行为,但是...在这种情况下指针(据我所知)不是易失性的,它指向那些易失性的数据,肯定是免费的,如果这种情况发生变化则不在乎?
有人能提供更好的解释吗? (或者为什么我完全错了!)
答案 0 :(得分:2)
你的假设不正确。由于volatile
写在*
的左侧,这意味着您有一个指向易失性数据的指针。与任何动态分配的数据一样,此数据可能会在malloc
和free
之间随意更改。 free
功能无关紧要。
如果由于某种原因你有int* volatile vint
,那么你会有一个易失性指针指向数据并且你的关注点是有效的,因为那时可能无法保证指针本身在malloc
和free
之间保持不变。但是没有理由编写这样的代码,所以这不是一个问题。
您收到警告的实际原因仅仅是因为free
需要void*
并且您正在传递volatile int*
。 C可以在void*
和int*
之间进行隐式转换,但是如果你添加一个类型限定符,例如volatile
或const
,那么一个体面的编译器会发出警告而不是静默接受演员。
您可以通过键入free((int*)vint)
或free((void*)vint)
来解决问题,它们同样正确。
根据经验:可以将常规指针转换为const
或volatile
,但不是相反:
int* a;
const int* b=a; // fine
int* c=b; // possible bug and/or bad practice
volatile int* d=a; // fine
int* e=d; // possible bug and/or bad practice
答案 1 :(得分:1)
警告不是free
特有的,与free
的内容没有任何关系,只是因为volatile
中没有free
限定词原型。如果您不想要警告,只需使用演员:
free((void*)vint);