Free不会释放作为va_arg列表发送的指针

时间:2017-01-30 14:45:33

标签: c linux variadic-functions

我想用下面的freeS宏释放一个变量指针列表:freeS(s1,s2,...);

尽管从freeSF函数获取了第一个指针地址的打印,但我的代码并没有释放第一个指针。 在主要的,免费(s1)工作,但它应该。正如预期的那样在主要崩溃中自由(s2)。

如何释放freeSF函数中的s1指针?

#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

#define freeS(...) freeSF("", __VA_ARGS__, NULL)
void freeSF(char *paramType, ...) {
    va_list pl;

    va_start(pl, paramType);
    paramType = va_arg(pl, char *);
    while (paramType) {
        printf("arg %p\n", paramType);
        free(paramType);
        paramType = va_arg(pl, char *);
    }
    va_end(pl);
}

int main(int ARGC, char** ARGV) {
    char *s1 = strdup("1");
    char *s2 = strdup("2");
    printf("s1 %p, s2 %p\n", s1, s2);
    freeS(s1, s2);
    free(s1);
}

1 个答案:

答案 0 :(得分:6)

您的计划展示undefined behavior,因为您可以双倍释放。

对于未定义的行为,任何事情都可能发生。您的程序可能会崩溃,它可能会输出奇怪的结果,或(在这种情况下)它可能似乎正常工作。添加看似无关的更改(例如调用printf或添加未使用的局部变量)可能会改变未定义行为的显示方式。

在这种情况下,在free(s1)中调用main并不会导致崩溃。它仍然是未定义的行为。例如,当我运行此代码时,它不会崩溃。但是,如果我在调用malloc之前添加了对free(s1)的调用,它就会崩溃。

仅仅因为代码可以崩溃并不代表