Ir ao conteúdo
  • Cadastre-se
HoonteR

C++ terminate called after throwing an instance of std bad_alloc

Recommended Posts

Boa tarde, estou aprendendo agora sobre programação orientada a objeto e a professora passou um exercicio para criar uma matriz de adjacência que represente um grafo, usando classe, destrutor, contrutor método para criar uma aresta entre 2 vértices, método para excluir uma aresta entre 2 vértices, método para mostrar a matriz de adjacência, até ai tudo bem, consegui criar a matriz tranquilamente( acho eu) até certa parte do codigo ela funciona perfeitamente, 

#include "grafo.h"
#include <iostream>
using namespace std;
grafo::grafo(int x)
{
    this ->tam = x;                                 // Tamnho definido pelo usuario
    for (int i=0; i < x;i++){
        for(int j=0; j < x; j++){
            mat[i * j] = 0;                             // inicializando a matriz com tudo zerado.
        }
    }
}
void grafo::getGrafo (){
    for (int i=0; i < tam;i++)
    {
        for(int j=0; j < tam; j++)
        {
            cout << mat[i * j] ;                    // Imprimindo a matriz.
        }
        cout<< endl;
    }
}
grafo::~grafo()
{

    //dtor
}

até aqui o codigo funciona de boa, o erro acontece quando tento criar um setGrafo, assim:

#include "grafo.h"
#include <iostream>
using namespace std;
grafo::grafo(int x)
{
    this ->tam = x;                                 // Tamnho definido pelo usuario
    for (int i=0; i < x;i++){
        for(int j=0; j < x; j++){
            mat[i * j] = 0;                             // inicializando a matriz com tudo zerado.
        }
    }
}
void grafo::setGrafo(int a, int b){
mat [ a* b] = 1;
mat [b *a] =1 ;
}
void grafo::getGrafo (){
    for (int i=0; i < tam;i++)
    {
        for(int j=0; j < tam; j++)
        {
            cout << mat[i * j] ;                    // Imprimindo a matriz.
        }
        cout<< endl;
    }
}
grafo::~grafo()
{

    //dtor
}

 quando insiro o setGrafo ele começa a dar erro de "terminate called after throwing an instance of std bad_alloc"..

o Main e o grafo.h ..

#ifndef GRAFO_H
#define GRAFO_H



class grafo
{
    private:
        int tam;                                    // tamanho da matriz
        int *mat = new int[tam * tam];              //Matriz para o grafo.
    public:
        grafo(int x);
        void getGrafo();
        virtual ~grafo();
        void setGrafo(int a, int b);
};

#endif // GRAFO_H
#include <iostream>
#include <grafo.h>
using namespace std;

int main()
{
    int x;
    cin >> (x);
    grafo teste(x);
    teste.getGrafo();
    return 0;
}

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que seja um erro de alocação de memória, se você inicializar uma matriz com 5 endereços, e tentar acessar o 6 vai dar um erro, por exemplo:

grafo teste(5); 

teste.setGrafo(6,5); // superior a 25 - erro

 

Porém testei seu código, e não vi nenhum erro, dei até uma testada em apenas um arquivo, segue:

#include <iostream>
using namespace std;

class grafo
{
    private:
        int tam;                                    // tamanho da matriz
        int *mat = new int[tam*tam];             //Matriz para o grafo.
    public:
        grafo(int x);
        void getGrafo();
        void setGrafo(int, int);
};

grafo::grafo(int x) : tam(x)
{
    for (int i=0; i < x;i++){
        for(int j=0; j < x; j++){
            mat[i * j] = 0;                             // inicializando a matriz com tudo zerado.
        }
    }
}

void grafo::getGrafo (){
    for (int i=0; i < tam;i++){
        for(int j=0; j < tam; j++){
            cout << mat[i * j] ;                    // Imprimindo a matriz.
        }
        cout<< endl;
    }
}

void grafo::setGrafo(int x, int y){
        mat [x*y] = 1;// inverter os valores não faz diferença
}

int main(){
        grafo teste(5);
        teste.getGrafo();
  	cout << endl;
        teste.setGrafo(6,5);
        teste.getGrafo();
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TYSQUARE89 entendo, a solução que acabei encontrando foi em um video no youtube que falava sobre o 'malloc', usando isso no código não tive mais nenhum problema com memoria, porém agora minha dificuldade é criar uma funçao que encontre um caminho e mostre ele na tela entre 2 vértices ( dadas pelo usuário), EX: vertices [1..3]as arestas são  1-3, 2-3 ai o usuario quer saber o caminho de 1 até 2, eu teria que imprimir na tela ( 1 -> 3 -> chega em 2)... to com problema de logica para resolver essa parte tentei varias coisas q não consegui teria como ajudar nisso??

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TYSQUARE89 O codigo que eu montei foi esse,

void grafo::caminho(int s, int d){
int caminho[tam],i,j=0;
bool verf[tam];
for (i=0;i<tam;i++){
    verf[i]=false;
}
i=0;
caminho[j]=s;
s=s-1; // destino é ele menos 1, porque a matriz começa em 0.
while(i < tam){
        if (mat[i][s] == 1){
            if(verf[i] == false){ //verfica se esse lugar ja foi acessado ou não.
                s=i;
                j++;
                caminho[j]=s+1;  //adiciona ao caminho esse novo endereço que vai ser acessado.
                i=0;
            }
        }
        i++;
        if(caminho[j]== d){ // verfica se ja chegamos ao destino.
            i=j;
            cout<<"destino "<<caminho[j]<<endl;
            for (j=0;j<=i;j++){
                cout<<" - " << caminho[j];     //imprime
            }
            cout<<endl;
            i=tam+1;
        }
        if (i == tam){                      // Caso essa vertice não tenha mais nenhuma aresta, ele volta a antecessora
                caminho[j]=0;
                j--;
                verf[s]=true;
                s = caminho[j]-1;
                while (caminho[j] == true){
                    j--;
                    if (j<0){           //Se tentar acessar algo antes do destino quer dizer que nao existe caminho.
                        i = tam+1;
                        cout << "Caminho nao existe."<<endl;
                    }
                }
                i=0;
        }
}
}

ele funciona se o caminho tiver 3 acessos apenas, exemplo: existe aresta entre a vertice 1-2 , 2-3, se eu pedir um caminho entre 1 e 3 ele vai imprimir      1-2-3, porém se tiver algo assim, 1-2, 2-3, 3-4 e eu pedir o caminho entre 1-4 ele entra em loop :V

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×