我试图在使用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。
这是我可以从大文件中提取的可能有意义的代码。
注意:我相信start和end可能存在一些问题,因为它被声明为指针但不使用malloc。
答案 0 :(得分:2)
对于许多系统日志记录,进程的可用内存不能给出预期的结果。 malloc/free
逻辑上分配/释放内存,并不意味着系统中进程的相应内存相应地增长或缩小。为了提高效率,系统不会这样做,因为太昂贵了。
想想带有页面的活页夹。当你的进程需要空间时,在当前在活页夹中设置的空白页面中搜索必要的空间,如果有的话,你的进程将使用它们(逻辑分配),如果没有,那么你需要在你的绑定器中添加新的空白页面然后使用它们(物理分配然后逻辑)。当你释放内存时,相应的页面只是逻辑删除(使用逻辑橡皮),但不会返回或删除。
当您记录进程的内存时,您记录的是绑定器中的页数...
虽然从进程空间中删除页面并不是不可能的(它取决于操作系统),但它不是由标准内存分配库完成的。