C++ Fehler: "double free or corruption (fasttop)"

Fonce

Captain
Registriert
Feb. 2006
Beiträge
3.376
Hi,
Ich habe da grade ein Problem bei dem ich den Fehler einfach nicht erkennen kann.
Ich teste grade ein wenig rum und bekomme bei meiner Beispielanwendung am ende folgenden Fehler

Habe das gefühl das ich irdendwas mit den desctructoren falsch gemacht habe oder so...

...double free or corruption (fasttop)...

Hier der Code.

IModule und IService sind in einer shared library.
Dispatcher und main.cpp bilden eine Binary welche dann gegen die shared library gelinked ist.

Code:
#ifndef IMODULE_H
#define IMODULE_H

#include <string>

    class IModule
    {
    private:
        std::string m_name;
    public:
        IModule(const std::string& name);
        virtual ~IModule();
        std::string getModuleName(){return m_name;}
    };
#endif // IMODULE_H

Code:
#include "imodule.h"

IModule::IModule(const std::string& name) : m_name(name)
{

}

IModule::~IModule(){

}

Code:
#ifndef ISERVICE_H
#define ISERVICE_H

#include "epdf_global.h"
#include "imodule.h"


    class EPDFSHARED_EXPORT IService : public IModule
    {
    public:
        IService(const std::string& name);
        virtual ~IService();
        virtual void start() = 0;
    };

#endif // ISERVICE_H

Code:
#include "iservice.h"

IService::IService(const std::string& name) : IModule(name)
{
}

IService::~IService(){

}

Code:
#ifndef DISPATCHER_H
#define DISPATCHER_H

#include "iservice.h"
#include <iostream>


    class Dispatcher : public IService
    {
    public:
        Dispatcher();
        ~Dispatcher();
        void start();
    };

#endif // DISPATCHER_H

Code:
#include "dispatcher.h"

Dispatcher::Dispatcher() : IService("EPDF_DISPATCHER")
{
}

Dispatcher::~Dispatcher(){

}
void Dispatcher::start(){
    std::cout << "Service "
              //<< getModuleName()
              << " started"
              << std::endl;
}

Code:
#include <QCoreApplication>

#include "dispatcher.h"

int main(int argc, char *argv[])
{
   Dispatcher dispatcher;
   dispatcher.start();
}
 
An deinem Code scheint mir erst mal nichts verkehrt zu sein. Wieso läßt du das Programm nicht mal mit Debuggerunterstützung laufen?
 
Hab nochmal getestet wie sich das ganze verhält wenn ich das Dispatcher als Pointer anlege und dann später mit delete lösche und hab danach ein dummy "int i = 0" eingefügt.
Der Fehler tritt hier erst nach dem "int...", also deim verlassen von main auf...

Wenn ich Debugge geht er nach main in den Disassembler("--" ist die aktuelle Zeile)

Code:
...
--	0x7f631a604ec5  <+0x00f5>         mov    %eax,%edi
	0x7f631a604ec7  <+0x00f7>         callq  0x7f631a61f540 <__GI_exit>
...

Und hier zeigt er dann an

Signal name: SIGABRT
Signal meaning: Aborted
Code:
...
	0x7f631a619f72  <+0x0032>         mov    $0xea,%eax
	0x7f631a619f77  <+0x0037>         syscall
	0x7f631a619f79  <+0x0039>         cmp    $0xfffffffffffff000,%rax
--	0x7f631a619f7f  <+0x003f>         ja     0x7f631a619f9a <__GI_raise+90>
	0x7f631a619f9a  <+0x005a>         mov    0x387ec7(%rip),%rdx        # 0x7f631a9a1e68
	0x7f631a619fa1  <+0x0061>         neg    %eax
...


Eine Idee?
 
Der MSVC++ Compiler lässt zumindest Deinen Beispielcode ohne Probleme laufen.
 
Hab den Fehler gefunden.
Der gcc benötigt hier anscheinend noch den Assigment Operator, da die Klasse nach der "Rule of Three" implementiert werden muss.
Nachdem ich diesen für IModule und IService als virtual implementiert habe läuft es ohne Fehler. ;)
Danke Leute ;)

EDIT:
Ok, nach dem es so zweimal ohne Fehler lief kam der Fehler dann aufmal doch wieder.
Habe nun mal das ganze getestet in dem ich es einmal in eine statische Bibliothek gepackt habe, was aber zu dem selben Fehler führte und dann hab ich es jetzt mal testweise mit in das gleiche Projekt wie Dispatcher gepackt und hier scheint es nun keine Probleme zu geben.
Das bringt mir aber nicht wirklich was, da die Klassen IModule und IService für mehrere Projekte zugänglich sein sollen...

EDIT:
Achja, was mir aufgefallen ist wenn ich die Klassen IModule und IService in eine Bibliothek packe und in deren Kontruktor und Destruktor ein cout packe(eben so bei Dispatcher), dann wird nur die Ausgabe von Dispatcher erzeugt.
 
Zuletzt bearbeitet:
Alles mit der selben Version des selben Compilers gebaut? Wenn nicht oder nicht sicher: Willkommen im C++ Klapsmühlen-Wunderland.
 
Ja alles auf dem gleichen System(Ubuntu 14.04, Qt Projekte(qmake) mit gcc als Compiler) gebaut.
Warum auch immer läuft jetzt auch wieder alles wunderbar aus der static library herraus und ich habe keine Ahnung warum :D

Ja solche Dinge nerven manchmal echt bei C++, aber warum auch immer finde ich das Arbeiten mit C++ immer noch angenehmer als mit Java.(Arbeite mit beiden beruflich)
Auch wenn einige mich für verrückt erklären, aber ich finde schon den Code deutlich besser lesbar und verständlicher...
 
Fonce schrieb:
Hab den Fehler gefunden.
Der gcc benötigt hier anscheinend noch den Assigment Operator, da die Klasse nach der "Rule of Three" implementiert werden muss.
Nachdem ich diesen für IModule und IService als virtual implementiert habe läuft es ohne Fehler. ;)

Ich glaube eher, du hast in deinem Programm nach wie vor irgend eine Art undefiniertes Verhalten drin, nur hast du es durch die zusätzliche Implementierung des assignment operators zufällig verdeckt. Was immer da vorher faul war, ist es jetzt immer noch ... nur manifestiert es sich jetzt (zumindest für den Moment :D) nicht mehr in einem Absturz.

Die Rule Of Three hat auch deine ursprüngliche Variante nicht verletzt ... sowohl der compiler-generierte Kopierkonstruktor als auch der compiler-generierte Kopier-Assignment-Operator sind in deinem Beispiel vollkommen ausreichend. Außerdem nutzt du in deinem Programm ohnehin weder den einen noch den anderen.
 
Zurück
Oben