“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
Vous devez vous connecter pour publier un commentaire.
Deux erreurs que je peux voir:
Comme il est non initialisée cela pourrait être d'écraser n'importe où dans la mémoire du processus, de sorte que pourrait être la corruption de la table virtuelle.
Vous pouvez changer ce (dans les deux constructeurs):
Destructeur utilise le mauvais
delete
surproovedor
:Comme c'est le C++, vous devez envisager l'aide de
std::string
au lieu dechar*
.Si vous ne changez pas de
std::string
alors vous devez soit:Donc, ce que vous dites, c'est que, en général, si la durée d'erreur se produit, vous êtes probablement sur-l'intensification de la mémoire de limites.
OriginalL'auteur hmjd
Une autre source de ce même message, c'est que gdb peut se confondre par la pas encore initialisé les variables. (Ceci répond à la question du titre, mais pas l'OP de la question, depuis une recherche sur le web m'a conduit ici à la recherche d'une réponse.)
Naturellement, vous ne devriez pas avoir de variables non initialisées, mais dans mon cas, gdb tente de montrer la fonction de variables locales avant même qu'ils sont déclarés/initialisé.
Aujourd'hui, je suis pas à pas dans un autre développeur gtest cas et ce message était fait jeter à la sortie de tous les temps, le débogueur s'est arrêté. Dans ce cas, la variable en question a été déclaré sur ~la ligne 245, mais la fonction a commencé sur ~la ligne 202. Chaque fois que j'ai arrêté le débogueur entre ces lignes, j'ai reçu le message.
J'ai travaillé autour de la question par le déplacement de la déclaration de variable en haut de la fonction.
Pour référence, je suis en train de tester avec gdb version 7.11.1 dans QtCreator 4.1.0 et j'ai compilé avec g++ version 5.4.1
OriginalL'auteur sage