Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Динамический массив std::string

#cpp #массивы


Мне нужен динамический массив строк.
Создаю его таким образом:

string *keySeq = new string[];
int strCounter = 0;


Далее в коде ругается на эту строчку:

keySeq[strCounter] = "";



  ОС Windows инициировала точку останова в FruitFly.exe.
  
  Это может быть вызвано повреждением кучи и указывает на ошибку в
  FruitFly.exe или в одной из загруженных им DLL.


Что тут не так?
MS Visual Studio 2010
    


Ответы

Ответ 1



std::vector v = {"Hello", "World"}; Поддержка инициализации неагрегатных типов через синтаксис с фигурными скобками была добавлена только с выходом стандарта C++11 (в GCC 4.4 и в Visual Studio 2013).

Ответ 2



Если используется std::string, то логично и дальше использовать стандартные типы, например, std::vector, как уже было предложено @dDevil. Это наиболее правильный подход. По коду, который написан изначально, можно сказать, что он: не соответствует Стандарту C++; содержит неопределенное поведение (UB). При вызове operator new[] должен быть передан размер массива. Запись без явного указания размера разрешена в visual C++, но это запрещено Стандартом. В данном случае запись new string[] интерпретируется как new string[0]. Т.е. массив из нуля элементов. При этом, как известно, в массиве разрешено обращаться только к элементам с индексами не меньше 0 и меньше размера массива. Т.к. массив пустой, элементов, к которым можно обращаться, просто не существует. Чтобы приведенный код, не порождал ошибку, нужно как минимум добавить ненулевую размерность при выделении памяти для массива: string *keySeq = new string[size]; где size - целое положительное число, задающее максимальное кол-во элементов массива.

Комментариев нет:

Отправить комментарий