Нет никакой веской причины НЕ использовать контейнеры STL, поскольку они являются ядром для C++, поэтому они будут доступны в каждом компиляторе на C++.
Но, чтобы ответить на ваш вопрос, если вы потребность, чтобы избежать их по какой-либо причине, вы можете сделать что-то вроде этого:
int iResponseCapacity = MAX_BUFFER*5;
int iResponseLength = 0;
char *response = new char[iResponseCapacity];
do
{
iRecv = recv(m_socket, recvBuffer, MAX_BUFFER, 0);
if (iRecv <= 0) break;
if ((iResponseLength + iRecv) > iResponseCapacity)
{
int iNewCapacity = iResponseCapacity + (MAX_BUFFER*5);
char *newResponse = new char[iNewCapacity];
memcpy(newResponse, response, iResponseLength);
delete[] response;
response = newResponse;
iResponseCapacity = iNewCapacity;
}
memcpy(&response[iResponseLength], recvBuffer, iRecv);
iResponseLength += iRecv;
}
while (true);
//...
delete[] response;
Ключ перераспределить response
буфер каждый раз, когда он заполняет до его максимальной емкости. Контейнеры STL, такие как std::string
и std::vector
, обрабатывают это внутренне для вас. Существует множество алгоритмов, позволяющих рассчитывать эффективные приращения роста при перераспределении, чтобы лучше максимизировать производительность и использование памяти, выше всего лишь простой пример для демонстрации идеи.
'std :: string' хорошо способен хранить двоичные данные, однако вы можете найти с помощью' std :: vector 'более удобно. –