gpt4 book ai didi

c - 使用相同的左值多次调用 strdup()

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:11 26 4
gpt4 key购买 nike

在我从前人那里继承的程序中,有以下格式的功能:

    somefunc(some_type some_parameter, char ** msg)

换句话说,最后一个参数是一个char **,用来返回消息。即:somefunc() 将“改变”msg。在某些情况下,所讨论的更改具有以下形式:

    sprintf(txt,"some text. Not fixed but with a format and variables etc");
LogWar("%s",txt); //call to some logging function that uses txt
*msg = strdup(txt);

我知道每次调用 strdup() 都应该有一个相关的调用 free() 来释放它分配的内存。

由于该内存用于返回某些内容,因此显然不应在 somefunc() 结束时释放它。

但那又在哪里呢?

如果 somefunc() 使用相同 msg 多次调用,那么我认为该指针会四处移动。所以 previous 调用分配的空间将丢失,对吗?

程序结束前的某处我当然应该free(*msg)。 (在这种情况下,*msg 是在调用 somefunc() 时用作参数的版本。)但我认为该调用只会释放最后分配的内存,而不是较早调用somefunc()时分配的内存,对吗?

所以,我说 somefunc() 应该是这样的,我说得对吗:

    sprintf(txt,"some text. Not fixed like here, but actually with variables etc");
LogWar("%s",txt); //call to some logging function that uses txt
free(*msg); //free up the memory that was previously assigned to msg, since we will be re-allocating it immediatly hereafter
*msg = strdup(txt);

所以在 strdup() 之前使用 free()

我说的对吗?

最佳答案

是的,你是对的。从 strdup() 返回的任何旧指针在覆盖之前必须是 free()d,否则会泄漏内存。

我敢肯定,为了清楚起见,您在这里说得很简单,但我当然会投票支持这样的事情:

const char * set_error(char **msg, const char *text)
{
free(*msg);
*msg = strdup(text);
}

然后:

LogWar("%s",txt);   //call to some logging function that uses txt
set_error(msg, txt);

看看我是如何使用封装使这个非常重要的序列更明确,甚至命名的?

关于c - 使用相同的左值多次调用 strdup(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12263196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com