【问题标题】:Free memory in C : how to check for valid pointer?C 中的可用内存:如何检查有效指针?
【发布时间】:2017-01-31 08:32:39
【问题描述】:

我有这个程序,它通过指向内存区域(结构、数组)的指针在内存中存储大量内容,并且这个用户可以随时启动程序。在初始化时,程序需要释放以前使用的内存(如果有的话,这就是问题所在)并分配可能不同大小的新存储。

现在在第一次初始化时,我不知道我的指针指向什么:特别是,我不知道它们是否是垃圾。然而,如果他们不是,我需要释放他们指向的东西。我怎么知道?

【问题讨论】:

  • 你根本做不到。
  • @George 我很害怕。一个想法突然出现在我的脑海中:将第一个 init 与只有 mallocing 而没有释放 - 因为系统刚刚启动,这是第一次也是所有 - 与我将称为“reinits”并且知道它们来的进一步的 init 分开在之前的 malloc 之后,他们可以再次释放指针和 malloc 后面的内容。 Stackoverflow 有时会通过灵感而不是其他人来提供答案......
  • 您必须对指针进行“簿记”。每当不再需要某些东西时,释放它并将指针设置为空。然后在你初始化时,任何不为 null 的都是必须释放的有效指针。
  • 不要忘记使用 purify 等工具验证您的程序是否存在内存泄漏。
  • 有一个简单的规则:你需要释放你分配的东西。如果您有一个指针,但您不知道它是否有效,那么您的程序中存在严重的设计错误。

标签: c pointers free garbage


【解决方案1】:

我们在这里谈论的是全局变量吗?因为它们被自动初始化为零。一般来说,您的程序应该以这样的方式编写,即指针永远不会指向垃圾,而是指向有效数据或具有 NULL 值(free(NULl) 是无操作)。

【讨论】:

【解决方案2】:

除了指向NULL 的指针不指向任何东西之外,没有办法检查给定的指针是否指向有效的东西。跟踪仍然指向动态内存的指针是您的工作。 (指针可以指向自动变量和static 变量,当然您必须尝试free。)

很多人一旦拥有freed 相关内存并依赖于C 标准将free(NULL) 定义为无操作这一事实,就会将指针设置为NULL。所以你可以采用这种方法。

但是过度依赖这种代码可能会很臭,因为它可以掩盖潜在的错误。只是要更加小心你的内存管理。

或者您可以自己构建其中之一:https://en.wikipedia.org/wiki/Boehm_garbage_collector

【讨论】:

  • 拥有像 static int* ptr = NULL; ... void create_stuff (void) { free(ptr); ptr = malloc(...) } ... void cleanup (void) { free(ptr); ptr = NULL; } 这样的代码是一种常见且非常安全的做法。这意味着可以在任何时间、以任何顺序调用这些函数,也可以在整个执行过程中多次调用这些函数。它在创建和销毁对象时提供了更大的灵活性,并且代码始终处于安全状态。相同的“设计模式”也可以用于其他类型的资源,例如线程句柄、文件句柄等。所有的好习惯,没什么不好的。
  • 点了。我稍微软化了这个警示故事。但是不要以NULL为借口写草率的代码。
猜你喜欢
  • 2022-08-22
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多