3

したがって、リンクされたリストが正しく作成され、適切にリンクされていますが、メモリの割り当てを解除しようとすると、ノードを削除できないように見えますが、リストはまだ存在しています。私のリストデコンストラクターのコード:

void LL_User::free_memory() {
    // TODO
    LL_User_Node *currentNode;
    currentNode = head;
    while(currentNode) {
        LL_User_Node *temp = currentNode;
        currentNode = currentNode->next;
        delete temp;
    }
    //cout << "LL_User::free_memory() is not implemented yet.\n";
}

LL_User::~LL_User() {
    if(head == NULL) {
        return;
    }
    free_memory();
}

そして、私のユーザークラスには、変数とデコンストラクター用にこれがあります:

User::User() {
    username = "";
    password = "";
    first_name = "";
    last_name = "";
    profile_pic_filename = "";
    birth_year = 0;
    birth_month = 0;
    birth_day = 0;
}

User::~User() {
    //Nothing placed in body because strings and ints are dealt with by OS?
}
4

2 に答える 2

4

現在書かれているコードには重大な欠陥が 1 つだけあります。にチェーンされているリストを削除しますがhead、ヘッドを に設定することはありませんNULL。この時点からそれに触れる人は、ガベージ ポインターを介して未定義の動作にヒットしています。

このようにリストを消去する場合は、head を NULL に設定します。または、とにかくこれが行われた後に行うhead必要があることがわかっているため、使用をまったく控えてください。リストを歩いているポインターとしてそれ自体を使用するだけです。それについてしばらく考えてみてください。NULLcurrentNodehead

head == NULLまた、デストラクタでは( ) のチェックは必要ありません。free_memory()本来あるべきように、すでに関数でチェックされています。

于 2012-11-19T18:32:52.707 に答える
-1

手動で割り当てを解除していますが、それが間違っています。賢明な人のようにスマート ポインターを使用し、自分の技術に対して報酬を得たい人のように機能するプログラムを用意します。

于 2012-11-19T18:35:50.677 に答える