题
这可以在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通常对这些事情非常宽容,并且通常可以干净地编译而无需显式转换。如果没有,请仔细考虑您所做的事情是否与您希望的一样明确且便于携带。
some_func
? some_func
要么返回一个适合传递给free的值,要么不返回。没有“合同”那里。但是,我是一个老屁,不相信混淆与管理层赢得布朗尼点。这些都是简单的概念。
@caf:这可能是编译器/库依赖的。像他一样检查更安全。仅仅因为你对NULL指针的免费检查的实现并不意味着他们都这样做。
如果你的意思是可以重复使用int指针而不是每次使用都声明一个新的指针,确定它没问题,但一般来说,如果你所有的 //做的东西
组成,它会让人感到困惑很多代码。另一个程序员可能会对 * i
的来源以及为什么这里的X和Y在那里的含义感到困惑。