我正在开发一个关于模拟p2p网络协议的Omnet ++和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()...
向节点发送消息时项目崩溃答案 0 :(得分: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()
类型的ponters,然后你free()
代替了delete
...他们有作为课程的感觉(至少根据他们的用法),所以他们可能是通过new
创建的,而不是Xalloc
()