struct foo
{
int a;
int b;
};
void* p = (void*)malloc(sizeof(struct foo));
((foo*)p)->a;//do something.
free(p);//Is this safe?
答案 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,但这种情况非常罕见。