2014-10-20 133 views
5

kullanma: MSVS2012C++: Erişim ihlali yazma yeri

Kod

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 yöntem

difficultyLevel

başlık dosyasında belirlenen bir dize adlandırılır önce belirlenmiş olan, 1 ile 4 arasında bir tamsayıyı geçirilir kesinlikle edilir. İlk if fonksiyonunu vuran

derleyici en kısa sürede ... bir işlenmeyen özel durum ve Erişim ihlali yazma konumunu atar.

if işlevlerini kaldırırsam ve aynı sorunu test etmek için algE olarak difficultyLevel tanımladım.

Tamamen difficultyLevel kaldırmak ve kod while döngüsü vurur kez sadece "algE.txt" ve "algEAnswers" sonra aynı sorun olsun ama farklı hafıza yerde dosyasını açarsanız.

+0

tam 'difficultyLevel' nedir? –

+0

Parametre, işlev içinde bir savrulma ile doğrulanmalı ve dışlanmamalıdır. Sorular küresel bir değişken ise, neden geri göndermeye çalıştığınızı bilmiyorum. –

+0

[MCVE] (http://stackoverflow.com/help/mcve) veya gerçekleşmedi. – Angew

cevap

13

Senin sorunun buradadır:

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

Sen ElemAlg bir örneğini oluşturarak değiliz, bu yüzden başlatılmamış bir işaretçi bir üye işlev diyorlar.

Çağrılan üye işlevi sanal olmadığından, derleyici herhangi bir çalışma zamanı araması yapmak zorunda kalmayacak, bu nedenle çağrı GetQuiz. Ancak, this işaretçisi çöp olacaktır (ea başlatılmamış halidir), bu nedenle bir üye değişkenine eriştiğiniz an (difficultyLevel gibi) tanımlanmamış bir davranışınız olacaktır. Durumunuzda, tanımlanmamış davranış bir erişim ihlaline yol açar.

Ya ea başlatmak: Eğer yığın üzerine tahsis etmek gerekmiyorsa,

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

ya da sadece yapın:

ElemAlg ea; 
ea.GetQuiz(1) 
+1

Çok teşekkür ederim ... Programım farklı ama sorunumu çözmeme yardımcı oldu ... Sadece bellek ayırma deyimini yeni anahtar kelime ile değiştiriyorum Açıklama ile aynı hata oluştu: 'MyQueue * newnode = (MyQueue *) malloc (sizeof (MyQueue)); ' \t \t Yukarıdaki ifadeyi aşağıdaki gibi değiştirin:' MyQueue * newnode = new MyQueue; ' –

İlgili konular