У меня есть вопрос о выделении и освобождении памяти.
Я хочу прочитать буфер символов в цикле и сохранить значения с плавающей точкой в вектор.
Я получаю буфер, читая fstream.
Но мой подход всегда дает сбой при удалении буферов в конце.
Проблема в том, что я меняю буфер во время цикла?
Кто-нибудь знает, как это исправить?
Я благодарен за каждый намек!
char* buffer1 = new char[size]; // the size is given
char* buffer2 = NULL;
fileStream.read(buffer1,size);
while(true)
{
// read double from buffer
// and get pointer to the new buffer -> buffer2
double tempDouble = strtod(buffer1, &buffer2);
// If nothing has been read (buffer stays the same) -> break
if (buffer1 == buffer2)
break;
else // change the buffer to read the next double during the next interation step
buffer1= buffer2;
// collect the doubles
collectedDoubles.push_back(tempDouble);
// if all numbers are read -> break
if (++doubleCount == numDoubles) // termination condition
break;
}
// delete the allocated buffer
delete[] buffer1;
// do I have th delete the 2nd buffer too?
// delete[] buffer2;
Согласно документам strtod
:
Функции устанавливают указатель, на который указывает str_end, чтобы указать на символ после последнего интерпретированного символа. Если str_end равен NULL, он игнорируется.
Итак, ваш указатель buffer2
все еще NULL
и после того, как вы buffer1= buffer2;
— buffer1
сейчас также NULL
(Кстати, здесь утечка памяти, поскольку данные теряются).
я тоже должен удалить второй буфер?
В этом случае — нет, потому что удаление NULL
указатель не работает.
Решение:
Посмотрите на пример, приведенный в документации для strtod
функция здесь аналогична вашему коду:
char* buffer1 = new char[size];
char* buffer2; // note no NULL here !
char* p = buffer1; // we'll modify this in loop
for (double tempDouble = std::strtod(p, &buffer2); p != buffer2; tempDouble = std::strtod(p, &buffer2))
{
p = buffer2;
if (errno == ERANGE){ // check if some error occured during attempt to convertion
std::cout << "range error\n";
errno = 0;
}
collectedDoubles.push_back(tempDouble);
if (++doubleCount == numDoubles) // termination condition
break;
}
delete[] buffer1;
Изменить 1: Посмотрите на элегантное и очень похожее на C ++ решение, предложенное @JerryCoffin в комментариях к вашему вопросу.
Других решений пока нет …