VC ++ 2010, кажется, выделяет только одну std :: string в фиксированном массиве

Это кажется простым для меня, но у меня возникли проблемы с тем, чтобы найти что-то однозначно заявляющее об этом.

Есть ли std::string stringArray[3] не создать массив std::string объекты, способ, которым SomeType typeArray[3] было бы? Фактическое число не имеет значения; Я просто выбрал 3 произвольно.

Похоже, что в отладчике Visual Studio 2010 создается одна строка, а не массив строк. Зачем?

Дикая догадка: это вызов по умолчанию std::string конструктор, а затем вызывать неиспользуемый доступ индекса 3? Если так, то почему это не вызывает исключение вне границ для пустой строки?

Это как-то связано с перегрузкой [] оператор?

Существует множество способов кодирования одних и тех же вещей без специального использования массива std::string без вопросов, но каково объяснение / обоснование такого поведения? Это кажется мне нелогичным.

Изменить: я нашел эту тему std :: string Доступ к элементу массива в котором комментарии к ответу, кажется, наблюдают то же самое поведение.

1

Решение

ОП НЕ сходит с ума. Но встроенный отладчик Visual Studio, безусловно, есть. Я считаю, что это провал в обнаружении оператора [] для std::stringЭто печально std::vector<std::string>

отлично ссылку на то, как вы можете обойти это с помощью окна наблюдения (нет способа сделать это с помощью окна Auto или Locals afaik), можно найти по адресу этот ранее опубликованный вопрос. Это также чрезвычайно полезный метод для просмотра динамических массивов на основе указателей (массивов, выделенных с помощью Type *p = new Type[n];). Подсказка: используйтеvarname,n» где varname переменная (указатель или фиксированный массив), и ‘n‘количество элементов для расширения.

Демонстрация для того, чтобы показать объявленный C-массив std::string и что наблюдал ФП, и std::vector<std::string> чтобы показать, как все должно выглядеть:

int main(int argc, char *argv[])
{
std::string stringArray[3];
std::vector<std::string> vecStrings(3);
return 0; // set bp *here*
}

введите описание изображения здесь

4

Другие решения

Отладчик Visual Studio часто показывает только первое, на что указывает массив или указатель. Вам придется использовать stringArray[1] stringArray[2] и т.д., чтобы увидеть дальше, чем это.

6

Это создает массив. Либо вы скомпилировали что-то другое, либо неверно истолковали результаты.

Он не создает массив в этих контекстах:

void function(std::string stringArray[3]) { }

Этот параметр функции является указателем на std::stringВы не можете иметь параметры функции типа массива.

extern std::string strnigArray[3];

Это заявляет, но не определять массив. Он сообщает компилятору, что в вызове программы есть массив из трех строк stringArray но на самом деле не создает его.

В противном случае он создает массив из трех строк.

Вы можете проверить это с помощью:

assert( sizeof(stringArray) == 3*sizeof(std::string) );

или в C ++ 11

static_assert( sizeof(stringArray) == 3*sizeof(std::string), "three strings" );
2

Да, отладчик в VS 2010 здесь не очень хорошо работает, но, как говорили другие, это только проблема отображения в отладчике, он работает так, как вы ожидаете.

В VS 2012 они сделали намного лучшую работу: —

введите описание изображения здесь

0
По вопросам рекламы [email protected]