Problema com violação de acesso a leitura

1. Problema com violação de acesso a leitura

Matheus de Castro Oliveira
Matheus10772

(usa Linux Mint)

Enviado em 22/07/2021 - 17:34h

Estou construindo um código em C++ que é capaz de manipular um grafo e fazer algumas operações com esse grafo. Após codificar a classe "Grafo", no entanto, toda vez que tento instanciar um novo objeto a partir dessa classe, o depurador emite uma mensagem de erro de violação de acesso a leitura, dizendo que "MyLast" era 0x8 no arquivo vector. Eu não consigo entender bem o que esse erro quer dizer e muito menos o que está causando esse erro, pois aos meus olhos de leigo parece que eu não fiz nada de errado. Vou postar as partes do código que interessa aqui em baixo:

#include <string>
#include <cstdlib>
#include <stdlib.h>
#include <cstring>
#include <vector>
#include <fstream>
#include <iostream>

using namespace std;

typedef struct
{
std::vector <int>* caminho;
std::vector <int>* distancia;
}distanciaCaminho;

class DadosDoArquivo
{
public:
int origem;
int destino;
int valor;
};

class Vertice
{
public:
unsigned int id = 0;
std::vector <int>* Antecessores;
std::vector <int>* Sucessores;
std::vector <int>* Adjacentes;
bool EscolhaGulosa = false;
/*std::string cor = "branco";
long int distanciaOrigem = NULL;*/
};

class Grafo
{
private:
void RealocarMatriz(unsigned int novoTamanho);
void CriaVertice(int vertice);
public:
std::string Direcionado;
int QuantidadeDeVertices = 0;
std::vector<std::vector<int>>* MatrizAdjacencia;
std::vector <Vertice>* Vertices;
std::vector<int>* VerticesAdicionados;
bool VerticePreDefinidos;
int QuantidadeDeArestas = 0;
int MaxFluxo;

Grafo(std::string Direcionado, unsigned int QuantidadeDeVertices, unsigned int QtdArestas);
Grafo(const Grafo& grafo) {
this->Direcionado = grafo.Direcionado;
this->QuantidadeDeVertices = grafo.QuantidadeDeVertices;
std::vector<std::vector<int>>* temp = new std::vector<std::vector<int>>(grafo.MatrizAdjacencia->size(), vector <int> (grafo.MatrizAdjacencia[0].size()));
copy(grafo.MatrizAdjacencia->begin(), grafo.MatrizAdjacencia->end(), temp->begin());
this->MatrizAdjacencia = temp;
std::vector <Vertice>* temp1 = new std::vector<Vertice>(grafo.Vertices->size());
copy(grafo.Vertices->begin(), grafo.Vertices->end(), temp1->begin());
this->Vertices = temp1;
std::vector <int>* temp2 = new std::vector<int>(grafo.VerticesAdicionados->size());
copy(grafo.VerticesAdicionados->begin(), grafo.VerticesAdicionados->end(), temp2->begin());
this->VerticesAdicionados = temp2;
this->VerticePreDefinidos = grafo.VerticePreDefinidos;
this->QuantidadeDeArestas = grafo.QuantidadeDeArestas;
}
~Grafo() {};
bool checarExistenciaVertice(int vertice);
std::vector <int>* Sucessores(unsigned int vertice);
std::vector <int>* Antecessores(unsigned int vertice);
void CriaAresta(int origem, int destino, int valor);
distanciaCaminho* MenorCaminhoDijkstra(int origem, int destino);
Grafo* FordFulkerson(int origem, int destino);
};

bool checkValoresValidos(std::string valoresValidos, char valores[]);
std::vector <std::string> splitString(std::string str, const char* op);
std::vector<std::vector<int>>* LerArquivo(std::string arqName);


E aqui, o construtor (a sobrecarga é um construtor de cópia):
Grafo::Grafo(std::string Direcionado, unsigned int QuantidadeDeVertices, unsigned int QtdArestas)
{
this->Direcionado = Direcionado;
this->QuantidadeDeVertices = QuantidadeDeVertices;
this->QuantidadeDeArestas = QtdArestas;
if (this->QuantidadeDeVertices != 0) {
this->MatrizAdjacencia->resize(this->QuantidadeDeVertices, vector<int>(this->QuantidadeDeVertices, 0));
this->VerticePreDefinidos = true;
}
else
{
this->MatrizAdjacencia->resize(1, vector<int>(1, 0));
this->VerticesAdicionados->resize(10, 0);
this->VerticePreDefinidos = false;
}
this->Vertices->resize(this->MatrizAdjacencia->size());
}



  


2. Re: Problema com violação de acesso a leitura

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/07/2021 - 23:45h

Não entendi a razão para você usar ponteiros para std::vector<int> como tipo de dados para vários dos campos nas suas classes em vez de simplesmente std::vector<int>.

Quando você faz, por exemplo,
this->MatrizAdjacencia->resize(this->QuantidadeDeVertices, vector<int>(this->QuantidadeDeVertices, 0)); 
sem ter, anteriormente, alocado um novo std::vector<int> e atribuído-o a this->MatrizAdjacencia, o método resize() vai ser aplicado a um objeto cujo local na memória é indeterminado. Grande chance de dar problema.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)