“Avertissement: impossible de trouver le symbole de l'éditeur de liens pour table virtuelle pour valeur XXX valeur” à l'aide de GCC et GDB (CodeBlocks)

J'obtiens une erreur à l'exécution ("la mémoire ne peut pas être écrite") qui, après inspection par le débogueur, conduit à l'avertissement dans le titre.

Les en-têtes sont les suivantes:

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

compléter.h la mise en œuvre

#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 la mise en œuvre

#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;
}

La méthode main où je reçois l'erreur d'exécution est le suivant:

#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;
}

MAIS, si au lieu de créer un "componente" objet, j'ai créer un "teclado" objet, je n'ai pas l'erreur d'exécution. J'ai TOUJOURS l'avertissement pendant le débogage, mais le programme se comporte comme prévu:

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

using namespace std;

int main()
{
    teclado a;
    a.print();
    return 0;
}

Cela renvoie "Teclas = 0" et des "Appuyez sur une touche..." chose.

Avez-vous une idée de pourquoi l'éditeur de liens est d'avoir troube avec cela? Il n'apparaît pas lorsque j'invoque la fonction virtuelle, mais avant, lors de la construction.

OriginalL'auteur Heathcliff | 2012-01-01