2014-10-20 19 views
5

Usando: MSVS2012C++: accedere al percorso di scrittura violazione

Codice

elemalg.h

#include <vector> 
#include <string> 
#include <fstream> 

class ElemAlg 
{ 
private: 
std::string difficultlyLevel, question, answerToRead; 
std::vector<std::string> questions, answers; 

std::vector<std::string> GetQuiz(int); 
}; 

elemalg.cpp

#include "elemalg.h" 

std::vector<std::string> ElemAlg::GetQuiz(int difficulty) 
{ 
if (difficulty == 1) { difficultyLevel = "algE"; } 
if (difficulty == 2) { difficultyLevel = "algM"; } 
if (difficulty == 3) { difficultyLevel = "algH"; } 
if (difficulty == 4) { difficultyLevel = "algVH"; } 

std::ifstream fin(difficultyLevel + ".txt"); 
while (std::getline(fin, question)) { questions.push_back(question); } 
fin.close(); 

std::ifstream fin2(difficultyLevel + "Answers.txt"); 
while (std::getline(fin2, answerToRead)) { answers.push_back(answerToRead); } 
fin2.close(); 

return questions; 
} 

MathTutor.cpp

#includes etc 
ElemAlg *ea; 
ea->GetQuiz(1); 

GetQuiz è sicuramente passato un numero intero compreso tra 1 e 4, questo viene verificata prima che il metodo è chiamato

difficultyLevel è una stringa definita nel file di intestazione.

Il compilatore genera un'eccezione Non gestita e Posizione di scrittura violazione di accesso ... non appena raggiunge la prima funzione if.

Se rimuovo le funzioni if e definisco difficultyLevel come algE solo per testare lo stesso problema.

Se rimuovo difficultyLevel del tutto e basta aprire il file come "algE.txt" e "algEAnswers" tanto ottengo lo stesso problema, ma in una posizione di memoria diversa una volta che il codice colpisce il ciclo while.

+0

Qual è 'difficultyLevel' esattamente? –

+0

Il parametro deve essere verificato all'interno della funzione con un assert e non all'esterno. Se le domande sono una variabile globale, non so perché provi a restituirla. –

+0

[MCVE] (http://stackoverflow.com/help/mcve) o non è successo. – Angew

risposta

13

Il tuo problema è qui:

ElemAlg *ea; 
ea->GetQuiz(1); 

Lei non è la creazione di un'istanza di ElemAlg, quindi si sta chiamando una funzione di membro su un puntatore non inizializzato.

Poiché la funzione membro chiamata non è virtuale, il compilatore non dovrà eseguire alcuna ricerca runtime, motivo per cui la chiamata va a GetQuiz. Tuttavia, il puntatore this sarà inutile (dato che ea non è inizializzato), quindi nel momento in cui si accede a una variabile membro (come difficultyLevel) si avrà un comportamento non definito. Nel tuo caso il comportamento non definito porta a una violazione di accesso.

O inizializzare ea:

ElemAlg *ea=new ElemAlg; 
ea->GetQuiz(1) 

o, se non necessario allocare sul mucchio basta fare:

ElemAlg ea; 
ea.GetQuiz(1) 
+1

Grazie mille ... il mio programma è diverso ma mi ha aiutato a risolvere il mio problema ... Ho appena cambiato l'istruzione di allocazione della memoria con la nuova parola chiave Errore con l'istruzione: 'MyQueue * newnode = (MyQueue *) malloc (sizeof (MyQueue)); \t \t Modificare l'istruzione precedente in: 'MyQueue * newnode = new MyQueue;' –

Problemi correlati