我有可能知道我是否在C中正确清理过?

时间:2012-03-26 00:03:03

标签: c memory-management memory-leaks

我的代码看起来像是

#include<stdlib.h>
#include<string.h>
char** someArray = NULL;
size_t numberOfEntriesInArray = 0;
void addToArray(char* someString){
  someArray = realloc(someArray, (numberOfEntriesInArray+1) * sizeof(char*));
  someArray[numberOfEntriesInArray] = malloc( (strlen(someString) + 1) * sizeof(char) );
  strcpy(someArray[numberOfEntriesInArray], someString);
  numberOfEntriesInArray++;
}
void deleteSomeArray(){
  int i;
  for (i = 0; i < numberOfEntriesInArray; i++){
    free(someArray[i]);
  }
  free(someArray);
}
int main(){
  addToArray( .. );
  ..
  deleteSomeArray();
}

有没有办法让我知道deleteSomeArray已正常运作? 即,是否有办法检查是否还有更多需要释放的内存?

P.S。

如果我在程序中泄漏了内存,那么当我的程序死掉时内存会自动释放吗?如果没有,有没有办法得到泄露的记忆?

5 个答案:

答案 0 :(得分:6)

  

有没有办法检查是否还有更多需要释放的内存?

使用memory debugger。如果您在Linux(或类似)中工作,则规范示例为Valgrind

  

如果我在程序中泄漏了内存,那么当我的程序死掉时内存会自动释放吗?

在大多数现代操作系统上,是的,当进程终止时,操作系统会回收所有内存。但你不应该把这当作泄露记忆的借口!

答案 1 :(得分:1)

  

如果我在程序中泄漏了内存,那么内存是否会自动释放   我的程序死了吗?

所有现代操作系统(Linux,Windows OS X,... Android,...)都会在程序(进程)死亡时清理。

您使用的是哪种操作系统?还有一些系统没有,但你需要告诉我们你用什么操作系统来帮助。


  

有没有办法让我知道deleteSomeArray工作正常?即是   有办法检查是否还有更多的内存需要   释放?

有很多方法可以解决这个问题。有商业产品可以做到这一点,但我认为你不想要其中之一。 Valgrind也是。

在你知道自己遇到问题之前,不要浪费时间和valgrind一起。如果你想知道“你是否丢失了一个指针而没有释放它?”,并且你正在使用Linux或gcc,那么你可能会看mallinfo。这个函数返回一个结构,它似乎可以告诉你malloc认为它有多少内存是免费的,以及它有多少。似乎非常简单,只需几分钟的努力。

答案 2 :(得分:1)

  

如果我在程序中泄漏了内存,那么当我的程序死掉时内存会自动释放吗?如果没有,有没有办法得到泄露的记忆?

操作系统内核将自动清理进程在其终止时打开的所有内存分配,打开文件,网络套接字等(无论进程终止的原因)。

only 异常是为System V IPC和POSIX IPC机制提供的共享内存,共享信号量和消息队列IPC功能;有关详细信息,请参阅ipc(5)msgget(3)semget(3)shmget(3)。 (您将知道您是否正在使用这些机制;它们并不常见。请参阅ipcs(1)实用程序,以便轻松查看系统上分配了哪些共享内存段,共享信号量和消息队列。)

答案 3 :(得分:0)

在Windows中,您可以使用函数_CrtDumpMemoryLeaks。如果将_CrtSetDbgFlag_CRTDBG_LEAK_CHECK_DF标志一起使用,则可以让调试器自动使用文件和行号信息吐出所有内存泄漏。这两个链接有更多关于可以完成的内存检查类型的信息。

答案 4 :(得分:-1)

你必须相信免费功能,因为你无法检查它是否成功(你应该记住它总是成功的,否则你的系统有一个大问题)。

在最近的操作系统中程序结束时,已分配的存储器被释放(即使我有内存泄漏)。

测试是否没有内存泄漏的唯一方法是使用Oli Charlesworth之类的内存调试器。 Valgrind是个不错的选择。

使用C语言编程(或任何允许您直接管理内存的语言)时,必须确保释放所分配的内容,因为编译器不会告诉您任何内容或程序。另外,标准C中没有任何功能可以为您提供此信息。