Пока много советов, но ни одного, которые касаются проблемы безопасности исключений: как избавиться от этой потенциальной утечки памяти?
Есть два способа избежать выделения с new
(и, таким образом, столкнуться с утечкой памяти). Первый чрезвычайно прост и использует расширение компилятора, известное как VLA для массива переменной длины:
std::string readString()
{
int strLen = Read<int>();
char rawString[strLen+1]; // VLA: the length is determined at runtime
// but the array is nonetheless on the stack
Read(rawString, strLen);
rawString[strLen] = '\0';
std::string retVal(rawString);
return retVal;
}
Другой соответствует стандарту: string
имеет внутренний буфер, к которому вы можете получить доступ (благодаря GMan, data
не является правильным методом доступа)
std::string readString()
{
int strLen = Read<int>();
std::string retVal(strLen, '\0'); // no need to allocate extra space
Read(&retVal[0], strLen); // &retVal[0] gives access to the buffer
return retVal;
}
Я верю, что последняя версия НАМНОГО лучше. Копирование больше не требуется:)