2

在我从前辈那里继承的程序中,有以下格式的函数:

    somefunc(some_type some_parameter, char ** msg)

换句话说,最后一个参数是 a 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()的消息多次调用,那么该指针将四处移动,我想。那么之前调用分配的空间会丢失,对吧?

我当然应该在程序结束之前的某个地方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);

所以用free() 之前strdup().

我对么?

4

1 回答 1

1

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

为了清楚起见,我确定您在哪里很简单,但我当然会投票赞成这样的事情:

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);

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

于 2012-09-04T12:13:07.807 回答