"Warnung: Kann nicht finden, linker symbol für virtuelle Tabelle für Wert XXX Wert" mit GCC und GDB (CodeBlocks)
Ich bin immer ein runtime error ("Speicher kann nicht geschrieben werden"), dass, nach der Kontrolle durch den debugger, führt zu der Warnung in den Titel.
Header sind die folgenden:
componente.h:
#ifndef COMPONENTE_H
#define COMPONENTE_H
using namespace std;
class componente
{
int num_piezas;
int codigo;
char* proovedor;
public:
componente();
componente(int a, int b, const char* c);
virtual ~componente();
virtual void print();
};
#endif //COMPONENTE_H
ergänzen.h Umsetzung
#include "Componente.h"
#include <string.h>
#include <iostream>
componente::componente()
{
num_piezas = 0;
codigo = 0;
strcpy(proovedor, "");
//ctor
}
componente::componente(int a = 0, int b = 0, const char* c = "")
{
num_piezas = a;
codigo = b;
strcpy(proovedor, "");
}
componente::~componente()
{
delete proovedor;//dtor
}
void componente::print()
{
cout << "Proovedor: " << proovedor << endl;
cout << "Piezas: " << num_piezas << endl;
cout << "Codigo: " << codigo << endl;
}
teclado.h
#ifndef TECLADO_H
#define TECLADO_H
#include "Componente.h"
class teclado : public componente
{
int teclas;
public:
teclado();
teclado(int a, int b, int c, char* d);
virtual ~teclado();
void print();
};
#endif //TECLADO_H
teclado.h Umsetzung
#include "teclado.h"
#include <iostream>
teclado::teclado() : componente()
{
teclas = 0;//ctor
}
teclado::~teclado()
{
teclas = 0;//dtor
}
teclado::teclado(int a = 0, int b = 0, int c = 0, char* d = "") : componente(a,b,d)
{
teclas = c;
}
void teclado::print()
{
cout << "Teclas: " << teclas << endl;
}
Die main-Methode, wo bekomme ich den runtime error ist der folgende:
#include <iostream>
#include "teclado.h"
using namespace std;
int main()
{
componente a; //here I have the breakpoint where I check this warning
a.print();
return 0;
}
ABER, wenn statt der Schaffung einer "componente" Objekt, erstelle ich eine "teclado" - Objekt habe ich nicht die runtime-Fehler. Ich bekomme immer NOCH die Warnung beim Debuggen, aber das Programm verhält sich wie erwartet:
#include <iostream>
#include "teclado.h"
using namespace std;
int main()
{
teclado a;
a.print();
return 0;
}
Zurück "Teclas = 0" plus die "Drücken Sie eine beliebige Taste..." - Sache.
Haben Sie eine Idee, warum der linker mit troube mit diesem? Es muss nicht zeigen, wenn ich rufen Sie das virtuelle Funktion, aber vor, während der Bauphase.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwei Fehler, die ich sehen kann:
Als es ist uninitialised könnte dies zu überschreiben, die irgendwo in der Prozess-Speicher, so könnte die Beschädigung der virtuellen Tabelle.
Könnte man dies ändern (in beide Konstruktoren):
Destruktor verwendet falsche
delete
aufproovedor
:Als diese ist C++ - Sie sollten erwägen, mit
std::string
stattchar*
.Wenn Sie nicht ändern, um
std::string
dann müssen Sie entweder:Andere Quelle dieser Nachricht ist, dass gdb können verwirrt durch noch nicht initialisierte Variablen. (Dies beantwortet die Frage-Titel aber nicht die OP ' s Frage, da die Suche im web hat mich hierher geführt auf der Suche nach einer Antwort.)
Natürlich, Sie sollten nicht über nicht initialisierte Variablen, aber in meinem Fall gdb versucht zu zeigen, Funktion lokale Variablen, noch bevor Sie deklariert/initialisiert.
Heute bin ich ein Schritt durch ein weiteres Entwickler-gtest Fall ist, und diese Botschaft wurde Sie geworfen zu Ausgang jedes mal, wenn der debugger gestoppt. In diesem Fall wird die variable in der Frage erklärt wurde, auf ~Linie 245, sondern die Funktion gestartet, die auf ~Zeile 202. Jedes mal hörte ich den debugger zwischen diesen Linien, erhielt ich die Nachricht.
Arbeitete ich, um das Problem durch verschieben der Deklaration der Variablen an den Anfang der Funktion.
Als Referenz, ich bin die Prüfung mit gdb version 7.11.1 im QtCreator 4.1.0 und ich kompiliert mit g++ version 5.4.1