2016-04-26 17 views
-3

malloc()関数を使用した後にメモリを解放しようとしていますが、それは私には機能しません。free()はC言語では動作しません

//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は使用しないため、開始点と終了点に問題があると考えられます。

+2

あなたはどういう意味ですか?それはどうやってテストしましたか? –

+1

問題のテストケースを表示するか、問題のあるコード全体を投稿してください。 – fluter

+3

ポインタは 'freePointer'で解放した後に' NULL'でなく、 'NULL' ***にローカルに設定しているので、「動作していません」という意味ですか?***その値は呼び出し側に戻ってきません。 –

答えて

2

多くのシステムログでは、プロセスの利用可能なメモリが予期した結果を得られません。 malloc/freeは、メモリを論理的に割り振り/割り当てを解除するため、システム内のプロセスの対応するメモリがそれに応じて増減することを意味しません。効率を上げるために、システムはあまりにも高価になるため、そのような振る舞いをしません。

ページが付いたバインダーについて考えてみましょう。プロセスにスペースが必要な場合は、バインダーに現在設定されている空白ページで必要なスペースが検索されます。使用されているプロセスがある場合(論理割り当て)、バインダーに新しい空白ページを追加する必要がある場合それらを使用する(論理的な物理的な割り当て)。メモリを解放すると、対応するページは論理的に消去されますが(論理的なゴムで)、返されたり削除されたりしません。

あなたがあなたのバインダ内のページ数でログインどのようなプロセスのメモリをログ...

(それはOSに依存します)プロセス空間からページを削除することは不可能ではありませんが標準のメモリ割り当てライブラリでは行われません。

関連する問題