0

オートグレーダーは、使用されているすべてのメモリを解放できなかったと言っています。どこでメモリリークが発生したのかわからないので、コード全体を次に示します。

struct lnode {
int count;
int line;
char* word;
struct lnode* next;
};


struct lnode* newNode(char* word, int line) {
struct lnode* temp = (struct lnode*)malloc(sizeof(struct lnode));
char* newWord = (char*)malloc(strlen(word) + 1);
newWord = strcpy(newWord, word);
temp->word = newWord;
temp->line = line;
temp->count = 1;
return temp;
}

void pushNode(struct lnode** head, struct lnode* node) {
node->next = *head;
*head = node;


}

struct lnode* getNode(struct lnode* head, char* word) {
struct lnode* current = head;
char* temp = (char *)malloc(strlen(word));
strcpy(temp, word);
while(current != NULL) {
    if(!strcmp(nodeGetWord(current),temp)) 
        return current; 

    current = nodeGetNext(current);
}
return NULL;
}

char* nodeGetWord(struct lnode* node) {
return node->word;
}

struct lnode* nodeGetNext(struct lnode* node) {
return node->next;
}

int nodeGetLine(struct lnode* node) {
int line = node->line;
return line;
}

int nodeGetCount(struct lnode* node) {
return node->count;
}

void nodeSetCount(struct lnode* node, int count) {
node->count = count;
}

void nodeSetLine(struct lnode* node, int line) {
node->line = line;
}

void deleteList(struct lnode** head) {
struct lnode* current = *head;
struct lnode* next;
while(current) {
    next = current->next;
    free(current);
    current = next;
}
*head = NULL;

}

void deleteNode(struct lnode** head, struct lnode* node) {
struct lnode* currentNode = *head;
struct lnode* previousNode = NULL;

while (currentNode != NULL) {
    if (currentNode != node) {
        previousNode = currentNode;
        currentNode = nodeGetNext(currentNode);
        continue;
    }

    if (previousNode)
        previousNode->next = node->next;
    else
        *head = node->next;
    free(node);
    break;
}
}

void printList(struct lnode** head) {
struct lnode* current = *head;
while (current != NULL) {
    printf("%s\n",nodeGetWord(current));
    current = nodeGetNext(current);
}

} 
int main() {
struct lnode* head = NULL;

struct lnode* a = newNode("Hello",3);
pushNode(&head, a);
struct lnode* b = newNode("Hi",2);
pushNode(&head, b);
struct lnode* c = newNode("Hola",4);
pushNode(&head, c);
struct lnode* d = newNode("Yo",5);
pushNode(&head, d);
struct lnode* e = newNode("Bye", 7);
pushNode(&head, e);
printList(&head);
//deleteNode(&head,e);
//printf("key: %s\n",nodeGetWord(e));
//printf("\n");
deleteList(&head);
printf("\n");
printList(&head);   
printf("\nDone\n");


}

main関数とprintList()関数は無視できます。これは、これをオートグレーダーに送信するとコメント化されるためです。これらはテスト目的でのみ使用されます。すべてが私にとって適切に機能しているようです。私は、何かが解放されるたびに更新されmalloc、何かが解放されるたびにデクリメントされるグローバル整数を実装していました。誰かがメモリリークの可能性がある場所を指摘できれば、それは素晴らしいことです!

4

2 に答える 2

1

ノードのprintfが何をすることを期待していますか? リストから何かを削除すると、削除されたものの印刷に影響することを期待しているのはなぜですか?

ノードを解放するという事実を除けば、リストからノードを削除することは関係ありません...リストではなくノードを印刷しています。印刷しているノードは、free未定義の動作である d のノードです。どのような動作になるかを知る方法はありません。あなたの実装では、ノードの値を出力する前にたまたま表示されますが、freeそれまたはそのようなものを当てにすることはできません。

編集:

オートグレーダーは、使用済みメモリをすべて解放できなかったと言っています。

単語にメモリを割り当てますが、解放することはなく、ノードを解放するだけです。2 つの free 呼び出しを freeNode に置き換え、ノードが所有するすべてのメモリを解放する freeNode を記述する必要があります。この場合は、free(node->word) と free(node) です。

于 2012-09-26T04:19:08.147 に答える
0

nodeGetWord渡されたノードからテキスト文字列を抽出するだけだと思います。そのため、ノードを削除した後も正しい文字列が出力されます。リストはまったく見ていません。

ただし、別のより深刻なエラーが発生します。それは、でノードを解放した後にノードにアクセスすることe ですdeleteNode。これは未定義の動作であり、悪いことです。

于 2012-09-26T07:52:50.120 に答える