我试图在使用 malloc() 函数后释放内存,但它对我不起作用。
//This becomes my header file
char* staticIP;
char* start = NULL;
char* ende = NULL;
char* splitString(char* start, char* ende) {
size_t len = ende-start;
char* result = (char*)malloc(sizeof(char)*(len+1));
strncpy(result,start,len);
result[len] = '\0';
return result;
}
//TO free memory
void freePointer(char* pointer) {
if (pointer != NULL) {
free(pointer);
pointer=NULL;
}
}
//Function uses splitString which does the malloc
void extractIP(char* buffer) {
char* start = strstr(buffer,"IP=")+3;
char* ende = strstr(start,":");
freePointer(staticIP);
staticIP = splitString(start,ende);
}
void setupWifi() {
char* result = WIFI.getIPString();
extractIP(result);
#ifdef DEBUG
USB.print("NEW IP: ");
USB.println(staticIP);
#endif
}
不幸的是,这对我不起作用,建议/更正将不胜感激
这是我的代码的可能用例:
#include<modwifi.h>
void setup() {
setupWifi();
}
一段时间后会重复调用此代码,每次都会更新静态IP,这需要释放旧的静态IP,但不起作用。我尝试在每次调用后记录内存,但它不断减少,直到达到 0。
这是我可以从大文件中提取的可能有意义的代码。
注意:我相信开始和结束可能存在一些问题,因为它被声明为指针但不使用 malloc。
最佳答案
唉,在许多系统上记录进程的可用内存并不能给出预期的结果。 malloc/free
逻辑上分配/释放内存,并不意味着系统中进程对应的内存相应增长或收缩。为了提高效率,系统不会这样做,因为成本太高。
考虑一下带有页面的 Binder 。当您的进程需要空间时,则在 Binder 中当前设置的空白页中搜索所需的空间,如果有,则您的进程将使用它们(逻辑分配),如果没有则您需要向 Binder 添加新的空白页然后使用它们(物理分配然后逻辑分配)。当您释放内存时,相应的页面只会被逻辑删除(使用逻辑橡胶),但不会返回或删除。
当您记录进程的内存时,您记录的是 Binder 中的页面数...
虽然从进程空间中删除页面并非不可能(这取决于操作系统),但标准内存分配库无法完成此操作。
关于c - free() 在 C 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36860883/