我正在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()向自己发送消息时,项目崩溃了。

最佳答案

免费但简短的代码审查:)

这个结构:

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()而不是delete ...它们具有被类化的感觉(至少根据它们的用法),因此可能是通过new而不是Xalloc()创建的

关于c++ - omn​​et++ free():无效的指针,错误134/139,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21709269/

10-12 16:58
查看更多