是否可以免费'void *'?

时间:2010-02-02 05:43:44

标签: c

struct foo
{
    int a;
    int b;
};

void* p = (void*)malloc(sizeof(struct foo));
((foo*)p)->a;//do something.
free(p);//Is this safe?

8 个答案:

答案 0 :(得分:33)

malloc返回void *并免费获取void *,因此您的某些演员阵容毫无意义,即使您从其他类型的演员开始,您总是会释放void *指针。

答案 1 :(得分:14)

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

答案 2 :(得分:6)

是 - free接受一个指向void的指针,因此当你调用它时,指针(隐式)转换为指向void的指针。

其余代码不太安全:

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

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

的错误

答案 3 :(得分:3)

是。 free的函数原型是偶数:

void free(void *ptr);

答案 4 :(得分:3)

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

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

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

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

答案 5 :(得分:2)

由于幕后发生的魔力,也许感觉安全。 C运行时和/或OS本身正在主动跟踪malloc返回的内存,包括其大小和位置。虽然看起来感觉就像是将无类型指针传递回free(),但事实上你传回了对内存管理器正在跟踪的对象的引用。

答案 6 :(得分:1)

是的,这是安全的。

答案 7 :(得分:-1)

是的,但通常它是设计不佳的标志。 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匹配,在另一个返回分配的内存中,还有二次资源,并且构造函数和析构函数匹配。应该很少分配内存区域,但不知道它的用途。而且你不应该交错分配并且混乱地释放。

现代C ++通过独特的指针收紧了这一点,这些指针已经拥有了#34;物体。虽然你可以有一个唯一的指针指向void,但这种情况非常罕见。