Я работаю над проектом на Omnet ++ и C ++ по моделированию протокола для p2p-сетей, который должен перенастроить их при выходе из узла. Но иногда симуляция вылетает и завершается, и на консоли я читаю: « * glibc обнаружен /opt/omnetpp-4.4/workspace/Progetto/Progetto: free (): неверный указатель: 0x09011e4c ** «
Таким образом, кажется, что free () является проблемой, но единственное освобождение, которое я делаю, это
удалить сообщение после того, как оно было обработано.
Я пытался удалить
delete msg;
но ошибка продолжает происходить.
Итак, как я могу это исправить?
Я не знаю, где это free () называется …
Если кто-то хочет взглянуть на код, он здесь
https://www.dropbox.com/sh/jdrqrt93qazn4xd/ae-qVqgzEF
ОБНОВИТЬ:
Я только что попытался запустить свой проект (имя которого ./Progetto) с помощью Valgrind, используя следующую команду, которую я нашел в руководстве:
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
()
Других решений пока нет …