Это кажется простым для меня, но у меня возникли проблемы с тем, чтобы найти что-то однозначно заявляющее об этом.
Есть ли std::string stringArray[3]
не создать массив std::string
объекты, способ, которым SomeType typeArray[3]
было бы? Фактическое число не имеет значения; Я просто выбрал 3 произвольно.
Похоже, что в отладчике Visual Studio 2010 создается одна строка, а не массив строк. Зачем?
Дикая догадка: это вызов по умолчанию std::string
конструктор, а затем вызывать неиспользуемый доступ индекса 3? Если так, то почему это не вызывает исключение вне границ для пустой строки?
Это как-то связано с перегрузкой []
оператор?
Существует множество способов кодирования одних и тех же вещей без специального использования массива std::string
без вопросов, но каково объяснение / обоснование такого поведения? Это кажется мне нелогичным.
Изменить: я нашел эту тему std :: string Доступ к элементу массива в котором комментарии к ответу, кажется, наблюдают то же самое поведение.
ОП НЕ сходит с ума. Но встроенный отладчик 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*
}
Отладчик Visual Studio часто показывает только первое, на что указывает массив или указатель. Вам придется использовать stringArray[1]
stringArray[2]
и т.д., чтобы увидеть дальше, чем это.
Это создает массив. Либо вы скомпилировали что-то другое, либо неверно истолковали результаты.
Он не создает массив в этих контекстах:
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" );
Да, отладчик в VS 2010 здесь не очень хорошо работает, но, как говорили другие, это только проблема отображения в отладчике, он работает так, как вы ожидаете.
В VS 2012 они сделали намного лучшую работу: —