3

重複の可能性:
C++ でメモリ リークをチェックする最良の方法は何ですか?

私はCで二重リンクリストを書いていますが、そのほとんどが実装され、機能しています(トラバースと解放のいくつかの小さな論理エラーを修正するだけで済みます)。

質問: 割り当てたすべてのメモリを確実に解放するにはどうすればよいですか? また、割り当てを最適化するためのテクニックがあるかどうかも知りたいです。それがどのように機能するか、またはチュートリアルへのリンクに関するヒントやヒントも高く評価されます.

私はほとんど初心者なので、コーディング手法を修正するための他のヒントをいただければ幸いです。gdbを使用してデバッグし、Archbang Linux x86_64 で実行しています。

ご協力ありがとうございました。

双方向リンクリストの構造は次のとおりです。

typedef struct node_element{
    double data;
} element;

typedef struct node_t{
    struct node_t *prev;
    struct node_t *next; 
    struct node_element element;
} node;

typedef struct list_t{
    struct node_t *head;
    struct node_t *tail;
} list;

これは私がリストを作成する方法です:

list *createList(){
    list *temp = malloc(sizeof(list));

    temp->head = malloc(sizeof(node));
    temp->tail = malloc(sizeof(node));

    temp->head->prev = NULL;
    temp->head->next = temp->tail;
    temp->tail->prev = temp->head;
    temp->tail->next = NULL;

    return temp;
}

新しいノード:

node *newNode(element * element){
    node *current = malloc(sizeof(node));
    current->element.data = element->data;

    return current;
}

個々のノードを削除します。私の質問にはあまり関係ありませんが、役立つ場合があります。

node *removeNode(list * list, node * current){
    if (current->prev == NULL)
        list->head = current->next;
    else
        current->prev->next = current->next;

    if (current->next == NULL)
        list->tail = current->prev;
    else
        current->next->prev = current->prev;

    free(current);

    return NULL;
}

ここで重要なのは、リストの作成が完了したら、次の関数を呼び出すことです。

list *removeList(list * list){
    node *temp; //Revised.
    //node *temp = malloc(sizeof(node));

    while (list->head != NULL){
        temp = list->head->next;
        free(list->head);
        list->head = temp;
    }

    return NULL;
}

そのようです:

a_list = removeList(a_list);
4

2 に答える 2

2

Valgrindが提供する多数の機能の中で、メモリ リークをチェックできます。これは、メモリ管理機能を動的に計測することによって行われます。

次のようなコマンドを使用できます。

valgrind --tool=memcheck --leak-check=yes my_prog
于 2012-12-08T19:49:16.183 に答える
-1

メモリを解放したい場合は、メモリの割り当てを解除する free() 関数、またはメモリを解放する dealloc() 関数を呼び出すことができ、関数を使用しているため、作成したポインター変数はその関数のスコープに制限されます。関数が終了すると、自動的に割り当てが解除されます。

于 2012-12-08T19:51:13.880 に答える