在c中可以这样做吗?
int *i;
// do stuff
i = NULL;
i = (int *) some_func();
// do stuff
if (i != NULL)
free(i);
i = NULL;
// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
free(i);
i = NULL;
1) 这取决于您与 some_func() 的合同。如果 some_func 期望您在其返回值上调用 free(),则您的代码是可以的。
2) 在 C 中重用变量是可以的,虽然不是非常优雅。通常最好将不同的变量用于不同的目的。从性能和内存使用的角度来看,它完全一样。
这取决于在some_func()
做什么。如果它正在分配内存malloc()
,那么你应该free()
在完成后使用它。如果不是,那么你不应该。请参阅该函数的文档以确定。
我会支持 Edgar 的回答,但也要注意这里的 NULL 测试是不必要的:
if (i != NULL)
free(i);
因为 free(NULL) 是允许的。
您的代码看起来不错 - 您要问的是哪个特定位?但请注意,如果函数返回一个 int *,则不需要强制转换,如果没有,您可能不应该将它分配给一个 int *。
好吧,我看到的唯一问题是不只与 C 相关的可读性问题。您在一个块中多次重用变量名,以至于很难找出它的用途。
如果您的意思是重复使用 int 指针而不是每次使用都声明一个新指针是否可以,那么肯定可以,但总的来说,如果您的所有代码都// do stuff
包含大量代码,则可能会令人困惑。*i
另一个程序员可能会对来自哪里以及为什么它在此处表示 X 和在此处表示 Y 感到困惑。
如果 some_func 返回一个指向动态分配内存的指针,是的。
只要 some_func() 做它应该做的就可以了。如果它为 i 分配了一个无效(未分配的)地址,它将导致您的程序崩溃。
取决于 some_func() 的合约。
如果 some_func() 分配了一些内存并将其指定为释放它的责任,那么是的,可以 free() 它。事实上,这是一个错误。
这是使用非托管语言工作的问题之一,您必须跟踪您拥有的资源并确保释放它们。
如果some_func()
“拥有”它的数据并且只返回指向它的指针供您检查,则不应释放它。如果它只malloc
适合你,那么你确实有责任做free
在你的第一步
int *i;
// do stuff
i = NULL;
如果我指向分配内存的东西,那内存不会永远丢失(内存泄漏)吗?
例如:
int *i;
i = (int*) malloc(sizeof(int);
i = NULL;
会留下一块 int 大小的内存漂浮在以太中。
您的 some_func() 示例也是如此,但我认为您正在正确测试以尝试释放 some_func() 留下的任何内容。特别是如果您不知道 some_func() 是如何工作的。
如果 some_func() 来自库,则可能有一个 free_some_func(i) 函数可以为您完成工作。
i = (int *) some_func();
你没有说返回类型some_func()
是什么,但是这(int *)
部分有点可疑。C 通常对这些事情非常宽容,并且通常可以干净地编译而无需显式强制转换。如果不是,请仔细考虑您所做的是否像您希望的那样定义明确且可移植。
@Kevin Montrose:嗯。是的,要求程序员有能力是一个真正的交易破坏者。也许我们在抛代码时都应该戴头盔,以防万一天花板掉下来。什么是“合同” some_func
?some_func
要么返回一个适合传递给 free 的值,要么不返回。那里没有“合同”。但是,我是个老屁,不相信通过混淆来赢得管理层的布朗尼积分。这些都是简单的概念。
@caf:这可能取决于编译器/库。像他那样检查更安全。仅仅因为您对 NULL 指针的免费检查的实现并不意味着它们都可以。