Да, но обычно это признак плохого дизайна.
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 ++ усиливает это с помощью уникальных указателей, которые «владеют» объектом. Хотя у вас может быть уникальный указатель на void, это будет очень редко.