Подводные камни взятия адреса элемента std::vector вместо использования data()
У меня есть вектор байтов std::vector<char>. Я хочу передать его данные функции send из Windows Sockets API. Первым пришло в голову сделать так:
std::vector<char> data;
// На этом моменте вектор заполняется данными
send(socket, data.data(), data.size(), 0);
Однако т.к. я использую старый стандарт C++ (Visual studio 2008 SP1), я не могу использовать метод data(), его просто нет. Тогда я прибегаю к этому:
std::vector<char> data;
// На этом моменте вектор заполняется данными
send(socket, &data[0], data.size(), 0);
Я провёл пару "экспериментов", создавая векторы разной длины, заполняя их данными, а потом получая эти данные таким же способом (т.е. исключительно через указатель и его смещения) и никаких ошибок не возникло. На основании этого я предполагаю, что такой способ передачи данных вектора в функцию send возможен и безопасен. Но всё же, на мой взгляд, такой способ выглядит "криво", а всё, что выглядит "криво", по моему опыту таит в себе ряд подводных камней (т.е. возможностей небезопасного поведения программы в какой-либо ситуации).
Отсюда вопрос: безопасно ли передавать данные вектора std::vector<char> data в функцию send таким &data[0] способом и в каких случаях это может привести к чему-то плохому (UB, исключения и т.д.)?
P.S. Прошу не советовать использовать более новый стандарт языка. Это никаким образом не возможно для меня.
Ответы (1 шт):
Вообще-то да, вроде бы безопасно.
Насколько я помню, даже в старом стандарте было положение, что данные в векторе расположены одним массивом (это не было закреплено de jure в стандарте для string, но de facto работало и там).
Update
Добавляю из комментариев:
&data[0]таки UB если size()==0- стоит помнить, что изменение размера/емкости вектора может делать указатели на его элементы невалидными