【发布时间】:2012-06-08 17:56:03
【问题描述】:
例如,如果我想编写一个使指针为空的“免费”,我可以编写如下内容:
void myfree(void **data) {
free(*data);
*data = NULL;
}
但是,当我尝试编写此代码时,我收到编译器警告(来自 gcc 4.6.2):warning: passing argument 1 of ‘myfree’ from incompatible pointer type [enabled by default] ... note: expected ‘void **’ but argument is of type ‘char **‘(在这种情况下,我正在释放一个 char 数组)。
似乎void* 是特殊情况以避免此类警告,因为calloc、free 等不会触发此类警告,但void** 不会(鉴于上述情况)。唯一的解决方案是显式转换,还是我误解了什么?
[我正在重新审视最近一个项目中的一些痛点,想知道如何才能更好地处理它们,所以我在探讨一些极端情况,因此今天提出了 C 问题。]
更新 鉴于void* 是特殊情况,我可以使用void* 来解决这个问题并在myfree 中强制转换,但这将是一个有点不负责任的解决方案,因为每个人和他们的狗都是将指针传递给看起来像free 的东西,所以我需要某种基于“间接程度”的编译器警告,这是一个实用的解决方案。因此出现了通用“指向指针的指针”的想法。
【问题讨论】:
-
通过时投到
void**。 -
是的,但它丑陋+凌乱,尤其是当
free不需要它时。因此想知道是否有更好的东西。 -
顺便说一句,IMO 在释放指针时不应该例行地将指针设置为 null。有些情况您确实需要,有些情况您不能(例如,如果指针本身是
const)。其他人认为始终设置为 null 非常重要,但我认为他们应该以不同的方式设计代码,以便一开始就减少悬空指针。大多数(不是全部)时间,您在释放包含它的结构之前释放一个指针,或者就在指针本身超出范围之前释放它。所以没有意义将它归零:它已经消失了。
标签: c pointers void-pointers