Один такой пример можно найти здесь.
Когда я изначально увидел этот вопрос, я был удивлен, что показанный код не создал неопределенного поведения. Это потому, что я думал, что она выполняла операцию запасного вместо операции Resisize . /code>, нет проблем с неопределенным поведением. < /p>
Для удобства есть копия кода. < /p>
Код: Выделить всё
const size_t recv_buffer_length = 128;
std::vector recv_buffer;
recv_buffer.resize(recv_buffer_length);
const auto byte_count = recv(peer_fd, recv_buffer.data(), recv_buffer_length, 0);
recv_buffer.resize(byte_count);
// does not print anything. `.size() > 0`, but each element is `\0`
for(const auto i: std::views::iota(0, byte_count))
{
std::print("{}", recv_buffer[i]);
}
< /code>
Решение неэффективно. Причина в том, что RESRIFE
Когда я изначально увидел этот вопрос, я думал, что он выполняет Резервная операция , чтобы избежать этого дополнительных накладных расходов. Однако я ошибся. recv возвращает количество полученных байтов, поэтому вектор просто должен быть изменен d до этого размера после того, как Recv вызывается для его заполнения данных.
Проблема в том, что если размер увеличивается, данные станут повреждены. < /p>
есть решение для этого? Предпочтительно тот, который избегает необходимости возвращаться к необходимости отслеживать указатель и переменную длины. < /P>
объяснить более подробно: < /p>
- Программа запускается в цикле, вызывая recv для заполнения вектора
- При первом запуске программы, резерв вызывается, с последующим изменением размер . Обе функции принимают некоторое значение, которое является максимальным размером буфера, используемого RECV . RESRIFE вызывается со значением нуля, чтобы убедиться, что программа находится в разумном состоянии.
- Программа входит в recv loop.
- вызывается, возвращая 200 байтов данных. Это меньше, чем векторная емкость, и 200 байтов записаны в буфер. resize вызывается с аргументом 200. Весь из первых 200 байтов перезаписывается Zeros.
Код: Выделить всё
recv
Не вызовите resize < /code> с аргументом нуля. < /li>
< /ul>
< P> Однако, поскольку программа работает в цикле, это будет работать только для первой итерации. После этого буфер был изменен до некоторого меньшего значения, и в какой -то момент будущий вызов должен будет вызовать Resectize с большим значением.
Подробнее здесь: https://stackoverflow.com/questions/794 ... t-of-resiz