free()在C中不起作用

时间:2016-04-26 09:32:38

标签: c

我试图在使用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。

1 个答案:

答案 0 :(得分:2)

对于许多系统日志记录,进程的可用内存不能给出预期的结果。 malloc/free逻辑上分配/释放内存,并不意味着系统中进程的相应内存相应地增长或缩小。为了提高效率,系统不会这样做,因为太昂贵了。

想想带有页面的活页夹。当你的进程需要空间时,在当前在活页夹中设置的空白页面中搜索必要的空间,如果有的话,你的进程将使用它们(逻辑分配),如果没有,那么你需要在你的绑定器中添加新的空白页面然后使用它们(物理分配然后逻辑)。当你释放内存时,相应的页面只是逻辑删除(使用逻辑橡皮),但不会返回或删除。

当您记录进程的内存时,您记录的是绑定器中的页数...

虽然从进程空间中删除页面并不是不可能的(它取决于操作系统),但它不是由标准内存分配库完成的。