gpt4 book ai didi

c - 反对 free_if_heap(void *ptr)?

转载 作者:行者123 更新时间:2023-12-04 09:08:11 27 4
gpt4 key购买 nike

我经常想用一个假设 free_if_heap(void *ptr)函数,因为这会让我无需关心就返回 malloc 的、静态的或堆栈对象。例如

char *foo(int arg) {
if (arg < 0) {
return "arg is negative";
}

if (arg > 0) {
size_t size = snprintf(NULL, 0, "%i is an invalid value", arg);
char *ret = malloc(size + 1); // FIXME: handle failure
sprintf(ret, "%i is an invalid value", arg);
// I use a varargs macro for the three lines above, to avoid format string duplication errors.
}

return NULL;
}

void main(void) {
for (int i = -1; i < 2; ++i) {
char *err = foo(i);
if (err) {
printf("Error: %s\n", err);
free_if_heap(err);
}
}
}
显然这样的函数一定不是一个好主意,因为它甚至从未达到 malloc 库,更不用说 C 标准了。
为什么是 free_if_heap(void *ptr)一个坏主意?

更新:
函数 foo只是一个函数的例子,它可以返回一个指向 malloc 数据或静态/全局数据的指针。这不是一个有目的的严肃功能。

更新:
需要知道指针(其他已知类型,如 char * )是否指向堆与需要知道 void * 指针指向什么类型的数据不同。 free_if_heap(void *ptr)需要一个 void *避免使用 free_if_heap_char(char *ptr) 的论据, free_if_heap_int(int *ptr)和一百个其他变体。

最佳答案

函数void free_if_heap(void *ptr)无法移植*但可能在选定的目标上实现,具体取决于 malloc() 的本地实现.
如果您不能或不想处理已分配对象的生命周期,您应该使用不同的编程语言和垃圾收集器。 C 有许多有效的替代方案,例如 Go。您也可以尝试使用保守的 C 垃圾收集器,例如 Boehm–Demers–Weiser garbage collector .
但是请注意,跟踪内存分配的对象并在使用后正确处理它们并不是那么困难,但需要一致的约定:例如您的 foo函数应始终返回分配的字符串或空指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *foo(int arg) {
if (arg < 0) {
return strdup("arg is negative");
}

if (arg > 0) {
size_t size = snprintf(NULL, 0, "%i is an invalid value", arg);
char *ret = malloc(size + 1);
if (ret != NULL) {
snprintf(ret, size + 1, "%i is an invalid value", arg);
return ret;
}
}
return NULL;
}

int main(void) {
for (int i = -1; i < 2; ++i) {
char *err = foo(i);
if (err) {
printf("Error: %s\n", err);
free(err);
}
}
return 0;
}

(*) 可移植的实现将是微不足道且无效的: void free_if_heap(void *ptr) {}

关于c - 反对 free_if_heap(void *ptr)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63408530/

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