0

私は、ノードが終了したときにそれらを再構成することになっている p2p ネットワークのプロトコルをシミュレートすることについて、Omnet++ anc C++ のプロジェクトに取り組んでいます。しかし、シミュレーションがクラッシュして終了し、コンソールで次のように表示されることがあります: " * glibc が検出されました/opt/omnetpp-4.4/workspace/Progetto/Progetto: free(): 無効なポインタ: 0x09011e4c * * ".

したがって、 free( ) が問題のようですが、私が行う唯一の解放は、メッセージが処理された後にメッセージを削除することです。私は削除しようとしました

delete msg;

しかし、エラーが発生し続けます。それで、どうすればこれを修正できますか?その free() がどこで呼び出されているのかわかりません...

誰かがコードを見たい場合は、ここにあります

https://www.dropbox.com/sh/jdrqrt93qazn4xd/ae-qVqgzEF

更新: チュートリアルで見つけた次のコマンドを使用して、Valgrind でプロジェクト (名前は ./Progetto) を起動しようとしました:

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-    fds=yes ./Progetto > log.txt

ログをpartebinにコピーしました。ここで読むことができます:

http://pastebin.com/KBWLE2jV

そのログを理解できません。また、valgrind で起動した場合にプロジェクトがクラッシュしないのはなぜですか? 唯一の問題は、ノードが scheduleAt( ) によって自分自身にメッセージを送信すると、プロジェクトがクラッシュすることです...

4

1 に答える 1

1

無料だが短いコードレビュー:)

この構造体:

struct secondNear {
    char near[8];
    char nearOfNear[8];
};

多くのエラーの原因になる可能性があります...使用しないのはなぜstd::stringですか?

それから:

            secondNear* sn = new secondNear();
            strcpy(sn->near, received->getSender());
            strcpy(sn->nearOfNear, received->getNear());
            this->near2.push_back(*sn);

メモリリークが発生するという事実に加えて、これもまた過度に複雑です。ヒープ上に新しい構造を作成する必要はありません。スタックを使用するだけです。

そして今、あなたのエラー:私はあなたが経由して多くのcModule型ポンターを取得し、代わりにそれらを取得していると思います...それらは(少なくとも使用法によると)クラスであるという感覚を持っているので、()ではなく経由で作成される可能性がありますgetSubModule()free()deletenewXalloc

于 2014-02-12T09:28:06.073 に答える