正确使用改变数据的自由功能

时间:2013-09-02 18:04:27

标签: c free

拜托,你能告诉我,如果我以正确的方式免费使用我的功能吗? 我用valgrind检查了我的代码,没有发生错误。

void strconcat (char **str1, const char *str2) {
    unsigned long str1len = strlen(*str1);
    unsigned long str2len = strlen(str2);

    char *tempStr = malloc(sizeof(char) * (str1len + str2len + 1));
    memcpy(tempStr, *str1, str1len);
    memcpy(&(tempStr[str1len]), str2, (str2len + 1));

    free(*str1);
    *str1 = tempStr;
}

在main-function中我以这种方式调用我的函数:

int main() {

    char *str1 = malloc(25);
    str1 = strcpy(str1, "First part of the string");

    char *str2 = malloc(16);
    str2 = strcpy(str2, " - second part.");
    printf("%s\n", str2);

    strconcat(&str1, str2);

    printf("%s\n", str1);

    free(str1);
    free(str2);

    return EXIT_SUCCESS;
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

void strconcat()函数中空闲后,您正在将malloc'd tempStr变量分配给*str1,因此在使用valgrind进行调试时不会出现任何错误。

从函数中删除*str1 = tempStr行,现在编译并运行程序将崩溃的程序。因为双重免费。

修改

你必须释放使用malloc分配的所有内存。在分配给其他变量之前,必须释放str1的内存以避免内存泄漏。

free(*str1) - free for memory allocated to str1 in main() function
free(str1) - free for memory allocated to tempStr in strconcat() function.
free(str2) - free for memory allocated to str2 in main function.

答案 1 :(得分:0)

是的,你正确使用它。在strconcat()中,当您为其分配新连接的字符串时,您将丢失最初分配给str1的内存,因此在此之前您应该free()。从该函数返回后,您仍然有两个动态分配的内存块,因此您应该释放这两个内存块。

Valgrind通常非常值得信赖,所以如果您正在运行所有相关的不同执行路径,那么您应该对它有信心。

你是否正在使用你的功能是一个好主意,但完全是另一回事。如果有人传入一个指向字符串文字的指针,那么你的函数就会发生灾难性的失败。您的代码还存在其他一些问题,包括strconcat是保留的标识符,但对于它的作用,您正确使用free()