c - free() 在 C 中不起作用

标签 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。

这是我可以从大文件中提取的可能有意义的代码。

注意:我相信开始和结束可能存在一些问题,因为它被声明为指针但不使用 malloc。

最佳答案

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

考虑一下带有页面的 Binder 。当您的进程需要空间时,则在 Binder 中当前设置的空白页中搜索所需的空间,如果有,则您的进程将使用它们(逻辑分配),如果没有则您需要向 Binder 添加新的空白页然后使用它们(物理分配然后逻辑分配)。当您释放内存时,相应的页面只会被逻辑删除(使用逻辑橡胶),但不会返回或删除。

当您记录进程的内存时,您记录的是 Binder 中的页面数...

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

关于c - free() 在 C 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36860883/

相关文章:

objective-c - 在 C/Objective-C 中加密 const char * 的简单方法是什么?

c - C中查找数组的性能

java - 使用 java 发送带有消息头 + InetAddress 的消息,但得到的结果与预期不同

c - 简单链表 - 无法访问节点

c char ** 导致分配错误

c - 在 GBDK C 项目中包含静态库 (GBExtended)

c - 一种将跟踪和回溯包含到 C 程序中的简单、统一和可移植的方法

c - "Dereferencing pointer to incomplete type"在列表中使用结构时 - C

C 程序 :Error when reading character from stdin using scanf

objective-c - CGContextRef 作为 OpenGL 上下文