2011-11-12 3 views
-1

これは改訂版です。キューのメモリを解放するには?鉱山は無料ではありません

メモリが3.5GBで、ポップアップ機能でメモリが解放されない...どうすればそれらのメモリを元に戻すことができますか?今私はSTLを使用しています。なぜなら、newとdeleteはポインタに対してのみ機能するからです。

queue<Graphnode> ss; 
    for(i=0;i<30000000;i++) 
    { 
     ss.push(*g.root); 
    } 

    printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"); 
     for(i=0;i<30000000;i++) 
    { 
     ss.pop(); 
    } 
    printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"); 
    //delete &ss; 

ここは私のnode.hファイルです。私はmallocとフリーまたはニュー、ポインタをここに削除する必要があると思いますか?

#include <stdio.h> 
#include <stdlib.h> 
#include <tr1/array> 

typedef struct point 
{ 
    std::tr1::array<int, 16> state; 
    int x; 
}point; 
typedef struct Graphnode 
{ 
    struct point pvalue; 
    int depth; 
    struct Graphnode *up; 
    struct Graphnode *down; 
    struct Graphnode *left; 
    struct Graphnode *right; 
}Graphnode; 

コードを修正した後は、このようになりますか?

#include <stdio.h> 
#include <stdlib.h> 
#include <tr1/array> 

typedef struct point 
{ 
    std::tr1::array<int, 16> state; 
    int x; 
    int depth; 
}point; 
typedef struct Graphnode 
{ 
    point *pvalue = (point *)malloc(sizeof(point)); 
    Graphnode *up = (Graphnode*)malloc(sizeof(Graphnode)); 
    Graphnode *down= (Graphnode*)malloc(sizeof(Graphnode));; 
    Graphnode *left= (Graphnode*)malloc(sizeof(Graphnode));; 
    Graphnode *right= (Graphnode*)malloc(sizeof(Graphnode));; 
}Graphnode; 
+0

'push'関数のコードと、キューの要素をどのように作成するのかを、おそらく追加してください。あなたの質問に 'C++'というタグを付けましたが、あなたは 'free'を使用しようとしています。 –

+0

sorry..itはスタック用ではないキュー用です。私はそれを変えた。 C言語の関数は何ですか?C++のfree()のように? – weeo

+0

'delete'演算子があります。 http://www.cplusplus.com/reference/std/new/operator%20delete/を参照してください。 'new'でオブジェクトを割り当てる場合は' delete'を使うべきです。また、C++の標準ライブラリでは、 'push_front()'や 'push_back()'を使用して、コンテナの先頭と末尾に要素を追加します。 –

答えて

3

あなたがc++を使用している場合は、標準ライブラリからqueue<T>を使用する必要があります。参照先はhttp://www.cplusplus.com/reference/stl/queue/です。

C++コードでは、絶対に必要でない限り、独自のコンテナクラスを作成しないでください。標準ライブラリには、ほとんどのユースケースをカバーする多くの便利なコンテナが用意されています。彼らは頻繁に使用され、テストされ、長年続いています。

+0

std :: dequeを基になるコンテナとして使用すると、メモリは増え続ける。 – Etherealone

0

空のキュー構造でもメモリが使用されます。私はあなたが

struct queue 
{ 
    queueElement* head; 
    queueElement* tail; 
}; 

のようなものだから、空のキューは、まだ彼らは両方ともNULLする場合であってもheadtailポインタを格納するためのメモリが必要になりますようキューを定義していると仮定しています。

どのようにメモリの使用量を測定していますか?明らかにsizeofはちょうどそれがちょうどstruct queueの一定のサイズになるのでいいです。だから私はあなたがそれを測定している他のツールやコードを持っていると仮定します。しかし、コードは私にはうまく見え、あなたが期待したように記憶を解放するだろう。

デキュー機能がtailを設定しないというバグが1つあります。しかし、head->nextに設定した後にheadがNULLの場合は、tailもNULLに設定する必要があります。これによりメモリーリークが発生するとは思わないが、デキューがキューを空にした後にエンキューすると、破損やセグメンテーションまで確実に開く。

+0

私はそれを監視するためにシステムモニターを使用しています。私はどのようにしたのかを示すコードを改訂しました....あなたの助けをありがとう、.... !! – weeo

0

struct Graphnodeが自己完結型であり、割り当てられたメモリへのポインタが含まれていない場合に限り、キューがクリーンアップできます。 initQueue以来malloc、その対応機能、emptyQueue、すべきではないfreeないこと

void emptyQueue(struct queue *q) { 
    queueElement *element, *nextElement; 
    element = q->head; 
    while(element) { 
     nextElement = element->next; 
     free(element); 
     element = nextElement; 
    } 
    initQueue(q); 
} 

注意。これにより、必要に応じてスタックにキューを作成することができます。

struct Graphnodeに割り当てられたメモリのポインタがある場合は、emptyQueueではなく、手動で行う必要があります。あなたのコードは次のようになります。

struct Graphnode node; 
while(!isEmpty(q)) { 
    node = front(q); 
    /* Delete the stuff in `node` here. */ 
    dequeue(q); 
} 

あなたのCコードのいくつかのコメントを...

if (q->head == NULL) { 
    //first element 
    q->head = newElement; 
    q->tail = newElement; 
} else { 
    //put it to the tail 
    q->tail->next= newElement; 
    q->tail = newElement; 
} 

を使用すると、両方のパスでq->tail = newElement;をやっているので、それを動かす:あなたが持っているenqueue

if (q->head == NULL) { 
    //first element 
    q->head = newElement; 
} else { 
    //put it at the tail 
    q->tail->next= newElement; 
} 
q->tail = newElement; 

また、一貫性のインデントを持っているのは良い習慣です。あなたのテキストエディタはあなたにこれを簡単にさせるべきです。 dequeue

if (q->head == NULL) { 
    //empty queue 
    return; 
} else { 
    element = q->head; 
    q->head = q->head->next; 
    free(element); 
} 

elseは常にreturn sの最初の部分であるため、必要とされていません。

最後
if (q->head == NULL) { 
    //empty queue 
    return; 
} 
element = q->head; 
q->head = q->head->next; 
free(element); 

ifEmptyで:

return (q->head == NULL ? 1:0); 

Cは==オペレータの結果は次のようであることが保証され、そうであることが真を強制ない点がありません0が非ゼロとしてtrueとfalse表します1;

return q->head == NULL; 

最後の注意:一部のシステムでは、topのようなプログラムにより読み出さ「使用するメモリ」はダウンしない場合があります。これは、システムが解放されたメモリのページを将来使用するために保持しているためです。物理メモリを解放するかもしれませんが、仮想メモリアドレスは終了するまでプログラムの "利用可能"として保持されます。

+0

大きな助けをありがとう!私はSTLを使ってコードを改訂しました。だから私はGraphnodeをやり直してそこに新しいものを置く必要があるのですか? – weeo

+0

まず、Graphnodeの 'point'がヒープから割り当てられている理由を教えてください。なぜ、Graphnodeに格納されていないのですか? –

関連する問題