【问题标题】:Can memory be freed if its pointer has changed type?如果指针改变了类型,是否可以释放内存?
【发布时间】:2013-06-13 15:05:40
【问题描述】:

给定内存分配:

struct typeA *p = malloc(sizeof(struct typeA));

然后在某个地方,例如在一个函数中,有两个选择:

void func(void *q)
{
     ....
    free(q);
}

void func(void *q)
{
    ....

    struct typeA *pp = (struct typeA *)q;
    free(pp); 
}

两者都可以,还是只有第二个可以?为什么?

【问题讨论】:

    标签: c pointers malloc free


    【解决方案1】:

    两者都可以。 free() 只关心存储在指针中的地址,并且在转换时不会改变。

    【讨论】:

    • 嗯,这取决于指针基类型的表示和对齐要求。 (intptr_t)p 不一定与(intptr_t)(struct TypeA *)pp 相同。
    • 并非所有指针的大小都相同,这取决于平台,因此转换指针可能会改变指针的值。
    【解决方案2】:
    struct typeA *pp = (struct typeA *)q;
    

    这种类型转换是不必要的。此外,free 参数的类型是指向void 的指针。因此,该函数无法知道用于访问对象*pp 的左值的类型。它只是接收一个原始指针。

    【讨论】:

      【解决方案3】:

      是的。

      由于free() 正在等待一个空指针,如果需要,您的编译器会将您的指针转换为void *

      【讨论】:

      • 编译器不会强制转换 - 不涉及强制转换,只是从 T *void * 的隐式转换。
      • 而且 sizeof(T *) 与 sizeof(void *) 不同?
      • void * 始终与任何数据指针类型兼容,并且会自动进行隐式转换。
      • 嗯,我使用了错误的表达方式,我不清楚隐式转换和转换之间的区别,准备修复答案。我认为“隐式转换”是一种“转换”,但没有这样的事情。
      • 没有“隐式转换”之类的东西 :) 显式类型转换称为转换,隐式类型转换称为合并或提升。
      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 2013-07-30
      • 2011-11-15
      • 2017-01-06
      • 2015-02-22
      • 2015-03-08
      • 2012-12-17
      • 2014-09-05
      相关资源
      最近更新 更多