1

我想制作一个标记化子程序,它将像这样工作:

  • 读取用户输入
  • 查找令牌
  • 使用子字符串函数获取每个标记
  • 将每个标记存储在结构中

这个想法很简单(我认为),但我想出了一个难题。在制作substring函数的时候,我意识到这是一个内存泄漏孔。我能想到制作子字符串函数的唯一方法是:

    char* sub = ( char* ) malloc ( ( some_length + 1 ) * sizeof( char ) );

    for ( i = start_index ; i < some_length ; i++ )
    {
         sub[ i - start_index ] = source_string[i];
    }

    sub[ some_length ] = '\0'

    return sub;

但问题是,当使用 substring 函数时,我将无法在之后释放该内存。

    // Example usage

    TokenStruct* MyToken = CreateToken( substring( input , start , length ) );

有些人可能会建议我应该在 CreateToken 函数中释放内存,但这对我来说似乎是一个非常糟糕的主意,因为它会使 CreateToken 的代码非常依赖于子字符串函数。此外,子字符串函数可能用于许多其他函数。

我有一个想法,在终止程序之前保留一个指针表并释放它们,但似乎有点粗略......

你们觉得怎么样?处理此类问题的最佳方法是什么?

提前致谢!

4

1 回答 1

3

这是 C 和其他同类型语言中非常常见的问题。基本上有三种解决方案:

  1. 要么单独调用,然后释放内存。
  2. 将指针保留在对象中(MyToken在您的情况下),并在释放对象时释放字符串。
  3. 使用数组,并将其(连同最大长度)传递给函数。

由于创建的指针MyToken无论如何都必须在对象 ( ) 的生命周期内“活动”,因此我建议使用方法二。

于 2013-05-25T18:25:48.890 回答