这可以在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);

因为允许空闲(NULL)。

您的代码看起来不错 - 您要问的具体位是什么?但请注意,如果函数返回int *,则不需要强制转换,如果不是,则可能不应将其赋值给int *。

我看到的唯一问题是可读性问题不仅仅与C绑在一起。你在一个块中重复使用了一个变量名,这很难找出它用于什么。

如果some_func返回指向动态分配内存的指针,则为。

只要some_func()执行它应该执行的操作,就可以了。如果它为i分配了一个无效(未分配)的地址,则会导致程序崩溃。

取决于some_func()的合约。

如果some_func()分配了一些内存,并指定你有责任释放它,那么就可以免费()它了。事实上,它不是一个错误。

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

如果 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指针的免费检查的实现并不意味着他们都这样做。

如果你的意思是可以重复使用int指针而不是每次使用都声明一个新的指针,确定它没问题,但一般来说,如果你所有的 //做的东西组成,它会让人感到困惑很多代码。另一个程序员可能会对 * i 的来源以及为什么这里的X和Y在那里的含义感到困惑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top