【问题标题】:How to assert that memory is freed如何断言内存已释放
【发布时间】:2013-04-24 17:04:42
【问题描述】:

我有一个函数,其中有一个空闲的内存。

我想在调用此函数后断言该函数已释放给定的内存。

我无法更改此函数中的任何内容。

我需要它来进行 uni 测试。我想测试我的函数,我想检查我的函数在调用它后是否真的释放了内存

问题在代码中

void func(char *mem)
{
  // Some where in the function there is a free of the memory
  // The free could be into if condition so there is a risk to not be executed
}

int main()
{
   char *mem = malloc(20);
   func(mem);
   // how to assert here that the memory is freed?
}

【问题讨论】:

  • 你不需要。如果你free()内存,它将被释放。
  • @H2CO3 仔细阅读问题。
  • @gbtimmon 我确实完整地阅读了这个问题。设计有缺陷,这是一个 XY 问题。解决方案不是“断言是否释放了内存”。
  • 我不确定,但也许您要确定的是内存是否真的被释放,如果没有断言或错误输出。这可能已经在 free 内部实现了。你不需要检查它。如果你想这样做,这将变得混乱和复杂
  • @H2CO3 我同意你的看法。我们必须自己跟踪。

标签: c++ c memory-leaks free assert


【解决方案1】:

简短回答:没有办法做到这一点。

确保释放的内存不会被意外重用或识别某些指针已释放的常用方法是在释放后立即将其设置为 NULL。为此,在您的示例中,您需要更改 func()。如果您无法对 func() 进行任何更改,则无法确定传递给它的指针是否已释放或仍然有效。

此外,如果您 func() 将为某些调用而不是为其他调用释放内存,那么这是一个糟糕的设计。必须有一种更好、更透明的方式来管理动态分配的内存。

【讨论】:

  • 我需要它来进行 uni 测试。我想测试我的功能并且我想检查我的功能是否真的释放了内存。和我的程序设计无关
  • 在这种情况下,您可以让 func() 在 释放 时将指针设置为 NULL,并在调用者函数中检查 NULL。
  • 将指针设置为 NULL 如何帮助我们确定内存已被释放?因为 func() 中的指针是一个副本,我们将该副本更改为 NULL,所以 main 的变量“mem”没有变化。
  • @ASHISHNEGI 您可以将指针传递给指针以修改调用者中的指针或使函数返回 null 或其他一些唯一值,让调用者知道传入的指针是空闲的d。如果 func() 可以修改,那么你想如何实现它是一个品味问题。
猜你喜欢
  • 1970-01-01
  • 2020-11-18
  • 2023-03-17
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多