0

在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;
4

13 回答 13

6

1) 这取决于您与 some_func() 的合同。如果 some_func 期望您在其返回值上调用 free(),则您的代码是可以的。

2) 在 C 中重用变量是可以的,虽然不是非常优雅。通常最好将不同的变量用于不同的目的。从性能和内存使用的角度来看,它完全一样。

于 2009-07-29T14:03:21.233 回答
3

这取决于在some_func()做什么。如果它正在分配内存malloc(),那么你应该free()在完成后使用它。如果不是,那么你不应该。请参阅该函数的文档以确定。

于 2009-07-29T14:00:47.727 回答
3

我会支持 Edgar 的回答,但也要注意这里的 NULL 测试是不必要的:

if (i != NULL)
    free(i);

因为 free(NULL) 是允许的。

于 2009-07-29T14:17:42.570 回答
2

您的代码看起来不错 - 您要问的是哪个特定位?但请注意,如果函数返回一个 int *,则不需要强制转换,如果没有,您可能不应该将它分配给一个 int *。

于 2009-07-29T14:00:10.847 回答
1

好吧,我看到的唯一问题是不只与 C 相关的可读性问题。您在一个块中多次重用变量名,以至于很难找出它的用途。

于 2009-07-29T14:02:44.120 回答
0

如果您的意思是重复使用 int 指针而不是每次使用都声明一个新指针是否可以,那么肯定可以,但总的来说,如果您的所有代码都// do stuff包含大量代码,则可能会令人困惑。*i另一个程序员可能会对来自哪里以及为什么它在此处表示 X 和在此处表示 Y 感到困惑。

于 2009-07-29T14:01:14.717 回答
0

如果 some_func 返回一个指向动态分配内存的指针,是的。

于 2009-07-29T14:01:28.820 回答
0

只要 some_func() 做它应该做的就可以了。如果它为 i 分配了一个无效(未分配的)地址,它将导致您的程序崩溃。

于 2009-07-29T14:02:00.907 回答
0

取决于 some_func() 的合约。

如果 some_func() 分配了一些内存并将其指定为释放它的责任,那么是的,可以 free() 它。事实上,这是一个错误。

这是使用非托管语言工作的问题之一,您必须跟踪您拥有的资源并确保释放它们。

于 2009-07-29T14:02:54.153 回答
0

如果some_func()“拥有”它的数据并且只返回指向它的指针供您检查,则不应释放它。如果它只malloc适合你,那么你确实有责任做free

于 2009-07-29T14:03:08.520 回答
0

在你的第一步

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) 函数可以为您完成工作。

于 2009-07-29T14:28:32.523 回答
0

i = (int *) some_func();

你没有说返回类型some_func()是什么,但是这(int *)部分有点可疑。C 通常对这些事情非常宽容,并且通常可以干净地编译而无需显式强制转换。如果不是,请仔细考虑您所做的是否像您希望的那样定义明确且可移植。

于 2009-07-29T14:30:37.213 回答
0

@Kevin Montrose:嗯。是的,要求程序员有能力是一个真正的交易破坏者。也许我们在抛代码时都应该戴头盔,以防万一天花板掉下来。什么是“合同” some_funcsome_func要么返回一个适合传递给 free 的值,要么不返回。那里没有“合同”。但是,我是个老屁,不相信通过混淆来赢得管理层的布朗尼积分。这些都是简单的概念。

@caf:这可能取决于编译器/库。像他那样检查更安全。仅仅因为您对 NULL 指针的免费检查的实现并不意味着它们都可以。

于 2009-07-29T14:45:12.743 回答