这段代码会导致内存泄漏吗?
Does this code cause memory leaks?
这里有人问了一个关于||
运算符的问题。他想知道为什么(j=3) || (i=3)
没有把3赋值给i。 post 在这里:
在我对这个问题的第一个回答中,我给出了这个 "feature" 如何使用的例子:
ptr = malloc(sizeof(*ptr)) || printf("Error\n");
是的,我知道它应该打印到 stderr,但这不是主题。如果我没记错的话,有人告诉我这个构造可能会导致内存泄漏。我觉得很难相信,所以请给我解释一下。
不使用这个构造有什么特殊原因吗?除了给人明显的 "because I can" 印象外?
如果malloc
失败了,你不会意识到;相反,您会将 printf
中的 return 值(打印的字符数)视为内存地址,从而导致未定义的行为。
这比内存泄漏还糟糕。
通过始终将 ptr
赋给 malloc
:
的结果,在赋值周围加上括号可以解决这个问题
(ptr = malloc(sizeof(*ptr))) || printf("Error\n");
但是,如果分配失败,您仍然需要确保避免使用指针,因此它不会为您节省太多代码。
这里有人问了一个关于||
运算符的问题。他想知道为什么(j=3) || (i=3)
没有把3赋值给i。 post 在这里:
在我对这个问题的第一个回答中,我给出了这个 "feature" 如何使用的例子:
ptr = malloc(sizeof(*ptr)) || printf("Error\n");
是的,我知道它应该打印到 stderr,但这不是主题。如果我没记错的话,有人告诉我这个构造可能会导致内存泄漏。我觉得很难相信,所以请给我解释一下。
不使用这个构造有什么特殊原因吗?除了给人明显的 "because I can" 印象外?
如果malloc
失败了,你不会意识到;相反,您会将 printf
中的 return 值(打印的字符数)视为内存地址,从而导致未定义的行为。
这比内存泄漏还糟糕。
通过始终将 ptr
赋给 malloc
:
(ptr = malloc(sizeof(*ptr))) || printf("Error\n");
但是,如果分配失败,您仍然需要确保避免使用指针,因此它不会为您节省太多代码。