gpt4 book ai didi

c - 对象创建 : Pointer to dynamically allocated data inside a value type object - good or bad?

转载 作者:太空狗 更新时间:2023-10-29 15:33:26 25 4
gpt4 key购买 nike

我有一个简单的结构:

typedef struct {
int width, height;
unsigned char *pixels;
} image;

哪个 API 更好?

image *imagecreate(int w, int h) {
image *img = malloc(sizeof(image));
img->width = w;
img->height = h;
img->pixels = calloc(w * h, 3);
return img;
}

void imagefree(image *img) {
free(img->pixels);
free(img);
}

image imagecreate(int w, int h) {
image img;
img.width = w;
img.height = h;
img.pixels = calloc(w * h, 3);
return img;
}

void imagefree(image *img) {
free(img->pixels);
img->width = img->height = 0;
}

?

为这样一个小结构做一个额外的 malloc() 似乎有点矫枉过正,它只是一个指向真正动态分配数据的指针的包装器。但另一方面,将指向动态分配内存的指针隐藏在值类型中感觉不自然(对我而言)。人们可能会认为您不必释放它。

最佳答案

你说的是 API。因此,您的客户应该易于正确使用且难以错误使用,这一点至关重要。

选项 #2 的小改进

例如,如果我是您的第二个 API 的用户:

image imagecreate(int w, int h);
void imagefree(image *img);

我可能甚至不会注意到调用 imagefree 的必要性,因为 imagecreate 返回一个对象,而不是指向对象的指针,而 imagefree 需要一个指针。我可能认为 imagefree 只是堆分配对象的 delete image 的包装器。所以我不会将它用于“堆栈”对象。

因此,这样更好:

image imagecreate(int w, int h);
void imagefree(image img);

虽然您在 image 中有一个堆分配的成员,但是您将它隐藏在这些 API 中,这很好。而且它们具有一致的“外观”,更好,更不容易出错。

那么选项 #1 呢?

至于你的第一个选择,那更好吗?那要看(因人而异)。至于我,我更喜欢选项 #1。

image *imagecreate(int w, int h);
void imagefree(image *img);

为什么?

虽然我们没有办法像 C++ 中的 RAII 那样通过析构函数强制执行资源自动销毁,但通常更多的注意力集中在 C 程序员身上,他们看到从 API 返回的“指针”(我们对指针很敏感,不是是吗?;)。很可能他们一直在问自己:它是在 imagecreate 内部动态分配的吗?我是否需要通过其他一些 API 取消分配它?

关于c - 对象创建 : Pointer to dynamically allocated data inside a value type object - good or bad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10187509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com