2013-05-10 4 views
1

Я работаю над назначением для создания класса контейнера для динамического массива строк. Я знаю, что было бы намного проще/лучше сделать с std :: vector, но дело не в этом. У меня возникла проблема с поиском правильного способа инициализации моего массива в конструкторе. Как это ниже, я все еще предупреждаю компилятор о том, что переменная lineArray не используется. Программа компилируется с предупреждением о том, что lineArray не используется, а затем зависает во время выполнения.Инициализация динамического массива строк (C++)

MyBag::MyBag() 
{ 
    nLines = 0; 
    std::string lineArray = new std::string[0](); 
} 
void MyBag::ResizeArray(int newLength) 
{ 
    std::string *newArray = new std::string[newLength]; 
    //create new array with new length 
    for (int nIndex=0; nIndex < nLines; nIndex++) 
    { 
     newArray[nIndex] = lineArray[nIndex]; 
     //copy the old array into the new array 
    } 
    delete[] lineArray; //delete the old array 
    lineArray = newArray; //point the old array to the new array 
    nLines = newLength; //set new array size 
} 
void MyBag::add(std::string line) 
{ 
    ResizeArray(nLines+1); //add one to the array size 
    lineArray[nLines] = line; //add the new line to the now extended array 
    nLines++; 
} 

http://ideone.com/pxX18m

+0

Остерегайтесь: ваша функция 'add' является ошибкой. После изменения количества строк уже было увеличено на ':: Resize', больше не нужно' nLines ++'. – 6502

+0

Я не знаю, является ли ваша «сумка» просто учебной вещью или чем-то, но с использованием std :: vector bag; было бы намного проще – paulm

ответ

1

Вы используете локальную переменную с именем lineArray в конструкторе. Вы хотите использовать элемент данных, например:

MyBag::MyBag() 
{ 
    nLines = 0; 
    lineArray = new std::string[0](); 
} 
1

Предупреждение к спасению. Хорошо, что у вас были предупреждения о компиляторе, иначе это было бы ошибкой, которая понадобилась бы больше времени, чтобы понять.

std::string lineArray = new std::string[0](); 
^^^^^^^^^^^ 

объявляет в новую переменную под названием lineArray с в конструкторе. Вы не используете члена класса. Указатель элемента lineArray по-прежнему будет указывать на неинициализированную память.


Это должно быть

lineArray = new std::string[0](); 
1

В дополнение к очевидной ошибки сообщает компилятором (т.е. инициализации локальной переменной, а не присваивание переменной экземпляра) у вас есть более серьезная проблема: если значение меньше nLines передано в ResizeArray, ваш код будет демонстрировать неопределенное поведение, записывая данные за конец выделенной области. Вы должны изменить код следующим образом:

void MyBag::ResizeArray(int newLength) 
{ 
    // Add a trivial optimization: 
    if (newLength == nLines) { 
     // No need to resize - the desired size is already set 
     return; 
    } 
    std::string *newArray = new std::string[newLength]; 
    //create new array with new length 
    for (int nIndex=0; nIndex < nLines && nIndex < newLength ; nIndex++) 
    { //        ^^^^^^^^^^^^^^^^^^^^^ 
     newArray[nIndex] = lineArray[nIndex]; 
     //copy the old array into the new array 
    } 
    delete[] lineArray; //delete the old array 
    lineArray = newArray; //point the old array to the new array 
    nLines = newLength; //set new array size 
} 
+0

+1, Это хороший улов. – jxh

1

В дополнение к затененной переменной-члена и ResizeArray меньшего выпуска массива, есть ошибка в вашем методе add(), как указано 6602. После Вашего звонка в ResizeArray, nLines уже был обновлен до нового значения, поэтому вы фактически записываете неправильное положение массива, а затем снова ошибочно увеличиваете nLines. Обязательно напишите в правильное положение, и нет необходимости увеличивать его.

void MyBag::add(std::string line) 
{ 
    int oldLength = nLines; 
    ResizeArray(nLines+1); //add one to the array size 
    lineArray[oldLength] = line; //add the new line to the now extended array 
} 
Смежные вопросы