代码之家  ›  专栏  ›  技术社区  ›  CodingLab

释放“void*”可以吗?

c
  •  25
  • CodingLab  · 技术社区  · 16 年前
    struct foo
    {
        int a;
        int b;
    };
    
    void* p = (void*)malloc(sizeof(struct foo));
    ((foo*)p)->a;//do something.
    free(p);//Is this safe?
    
    8 回复  |  直到 16 年前
        1
  •  33
  •   Laurence Gonsalves    9 年前

    对。

    马洛克回归 void * 自由拿走 空洞* 所以你的一些角色是没有意义的,你总是在释放一个 空洞* 即使你是从其他类型的指针开始。

        2
  •  14
  •   friedo    16 年前

    是的,很安全。在分配内存时,运行库跟踪每个分配的大小。当您调用free()时,它会查找地址,如果找到该地址的分配,则会释放正确数量的内存(在该地址分配的块)。

        3
  •  6
  •   Jerry Coffin    16 年前

    是的—— free 获取指向void的指针,因此当您调用它时,指针在任何情况下都会(隐式)转换为指向void的指针。

    您的其他代码并不十分安全:

    void* p = (void*)malloc(sizeof(foo));
    

    你应该 从malloc转换返回(在c中)。这可以掩盖忘记 #include <stdlib.h>

        4
  •  3
  •   jamesdlin    16 年前

    对。函数原型 free 偶数:

    void free(void *ptr);
    
        5
  •  3
  •   matt    16 年前

    在C中,它是完全安全的,因为没有可调用的析构函数。

    内存系统跟踪它们的分配大小。

    在C++中,必须删除新的相同类型,包括使用Dele[]运算符删除新的数组。

    这只是为了确保调用析构函数。

        6
  •  2
  •   rickmode    16 年前

    也许没有 感觉 因为在幕后发生的魔法而安全。C运行时和/或操作系统本身正在积极跟踪malloc返回的内存,包括其大小和位置。看吧,虽然你感觉好像在把一个无类型的指针传递回free(),但实际上你传递回了一个对内存管理器正在积极跟踪的对象的引用。

        7
  •  1
  •   Hogan    16 年前

    是的,它是安全的。

        8
  •  -1
  •   Malcolm McLean    9 年前

    是的,但通常这是设计不好的表现。 malloc()通常用于分配缓冲区(相同基元类型的大型数组)或对象(初始化了字段的结构)。在这两种情况下,malloc和free都应该匹配

      unsigned char *rgba_buffer = malloc(width * hieght * 4);
      /* use the buffer here */
      free(rgba_buffer);
    
      BITSTREAM *bs = bitstream("bitfile.boin");
      /* use the bitstream here */
      destroy_bitstream(bs);
    
      typedef struct
      {
         FILE *fp;
         unsigned char ch;
         int index;
      } BITSTREAM;
    
    
      BITSTREAM *bitstream(const char *filename)
      {
          BITSTREAM *bs = malloc(sizeof(BITSTREAM));
          bs->fp = fopen(filename "rb");
          /* etc */
          return bs;
      }
    
      void destroybitstream(BITSTREAM *bs)
      {
         if(bs)
         {
            if(bs->fp)
              fclose(bs->fp);
            free(bs);
         }
      }
    

    在一种情况下,malloc和free-match,在另一种情况下返回分配的内存,也有辅助资源,构造函数和析构函数匹配。应该很少分配一个内存区域,但不知道它用于什么目的。而且你不应该交错分配和混乱地释放。

    现代C++用“自己拥有”对象的唯一指针来收紧这一切。虽然你可以有一个独特的指向虚空的指针,但它是非常罕见的。