0

我正在开发一个关于 Omnet++ anc C++ 的项目,该项目是关于模拟 p2p 网络的协议,该协议应该在节点退出时重新配置它们。但有时模拟崩溃并退出,在控制台上我读到:“ * 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类型的 ponters viagetSubModule()然后你free()而不是delete......他们有成为类的感觉(至少根据他们的用法)所以它们可能是通过new而不是Xalloc()

于 2014-02-12T09:28:06.073 回答