我的代码看起来像是
#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。
如果我在程序中泄漏了内存,那么当我的程序死掉时内存会自动释放吗?如果没有,有没有办法得到泄露的记忆?
答案 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中没有任何功能可以为您提供此信息。