问题描述
背景
在与 C++
一起为高级项目工作一段时间后,我正在学习低级开发。目前正在对典型的 C
模式胡言乱语,并在 linux 内核和旧电子邮件的各个方面磕磕绊绊。
问题
是否有一组常用/惯用的宏或通用函数来减少内存分配中的重复或错误?
我在我的代码中经常看到的东西是 malloc 内部的长乘法语句,我认为它很乏味,而且是解决问题的成熟场所。 示例:
struct my_struct {
size_t size;
char* memory;
}
struct my_struct* my_struct_new(size_t size) {
struct my_struct* ms = malloc(sizeof *ms)
ms->size = size;
ms->memory = malloc(size * sizeof *ms->memory);
return ms;
}
我试图通过在这里尝试失败来避免造成 XY 问题。
感谢您抽出宝贵时间。
解决方法
不,这几乎是 C 中分配内存的惯用方式。*alloc
函数不知道也不关心类型,它们只关心您想要多少字节。获得该数字的最佳方法(对于字符串或字节缓冲区以外的其他内容,无论如何)是将目标的大小 (sizeof *ms->memory
) 乘以您想要的元素数 (size)
。否则您可以使用 calloc
将这些内容作为单独的参数传递,但 calloc
会将内存零初始化,这可能是您想要的,也可能不是。
您可以而且应该将复杂的分配抽象到它们自己的函数中(就像这个片段一样)。但就任何现有的便利宏而言 - 并非如此。
,是否有一组常用/惯用的宏或通用函数来减少内存分配中的重复或错误?
不是真的,@John Bode 已经涵盖了大部分内容。
为 struct my_struct
创建一个分配器函数 - 在 C 中非常惯用。
实现中的一个小弱点是缺乏对内存不足的检查——这是健壮代码所期望的。
struct my_struct* my_struct_new(size_t size) {
struct my_struct *ms = malloc(sizeof *ms)
if (ms) {
ms->size = size;
ms->memory = malloc(size * sizeof *ms->memory);
if (ms->memory == NULL) {
free(ms);
ms = NULL;
}
}
return ms;
}
struct my_struct_fma {
size_t size;
char memory[];
}
struct my_struct_fma *my_struct_new_fma(size_t size) {
struct my_struct_fma *ms = malloc(sizeof *ms + sizeof *ms->memory * size);
if (ms) {
ms->size = size;
}
}
return ms;
}