2014-12-15 3 views
1

Начальный программист здесь. Я получаю ошибку нарушения прав доступа в моей программе направленного графа, и мне интересно, может ли кто-нибудь объяснить мне, почему.Нарушение прав доступа в C++

Вот код неисправности (не беспокойтесь, это немного). Этот код из моей основной функции. Я только что прочитал некоторую информацию из файла, проанализировал ее и попытаюсь вставить ее в ведро с помощью функции InitialInsert.

//Store parsed file values 
sourceCity = line[0]; 
destinationCity = line[1]; 
miles = stoi(line[2]); 
cost = stoi(line[3]); 

//Insert parsed values into Info bucket 
graph.InitialInsert(sourceCity, destinationCity, miles, cost, size++); //Size is initialized to 0 

Это начальная функция вставки.

//InitialInsert function 
void Graph::InitialInsert(string source, string destination, int distance, int price, int index) 
{ 
    InfoBuckets[index]->sourceCity = source; 
    InfoBuckets[index]->destinationCity = destination; 
    InfoBuckets[index]->miles = distance; 
    InfoBuckets[index]->cost = price; 
} 

И это из моего заголовочного файла.

static int const ARRAY_SIZE = 1000; 
struct InitialInfo 
{ 
    string sourceCity; 
    string destinationCity; 
    int miles; 
    int cost; 
}; 
InitialInfo* InfoBuckets[ARRAY_SIZE]; 

Я получаю сообщение об ошибке «Нарушение прав доступа чтения местоположения 0xCCCCCCE4», когда я попал в первую линию моей функции InitialInsert. Это, наверное, глупая проблема, но может ли кто-нибудь помочь мне?

+4

Я предполагаю, что вы не делаете указателей в точке «InfoBuckets» в любом месте до их использования. – juanchopanza

+0

Где именно "размер" инициализирован? Какое значение должно быть при первом вызове функции? – wolfPack88

+0

похоже, что вы не выделяете пространство для своих объектов 'InitialInfo' –

ответ

1

Вы заданы ARRAY из 1000 указателей InifitalInfo, но InitialInfo [0] никогда не инициализировался.

Попробуйте это:

массив объектов

InitialInfo InfoBuckets[ARRAY_SIZE]; 

... 

void Graph::InitialInsert(string source, string destination, int distance, int price, int index) 
{ 
    InfoBuckets[index].sourceCity = source; 
    InfoBuckets[index].destinationCity = destination; 
    InfoBuckets[index].miles = distance; 
    InfoBuckets[index].cost = price; 
} 

или

Массив указателей

InitialInfo *InfoBuckets[ARRAY_SIZE]; 

... 

InfoBuckets[0] = new InitialInfo(); // You need create the object first before using 

... 

void Graph::InitialInsert(string source, string destination, int distance, int price, int index) 
{ 
    InfoBuckets[index]->sourceCity = source; 
    InfoBuckets[index]->destinationCity = destination; 
    InfoBuckets[index]->miles = distance; 
    InfoBuckets[index]->cost = price; 
} 

Как @Roddy recomends, вы должны использовать смарт-р вместо новых операторов. Вы можете прочитать об этом в link.

+0

Что делать, если вы делали 'InfoBuckets [index] = new InitialInfo();' в методе InitialInsert? –

+0

Удалите массив указателей, и у вас есть шанс +1. В противном случае, по крайней мере, сделайте умные указатели :-( – Roddy

+0

Взял совет Давида Исла и заставил его работать (я знал, что это глупая проблема, но спасибо, что потакали мне. :)) –

Смежные вопросы