在循环中使用strtof来解析char缓冲区中的数字

时间:2017-02-03 15:57:47

标签: c++ buffer dynamic-memory-allocation strtod

我有一个关于分配和释放内存的问题。

我想在循环中读取char缓冲区并将float值保存到向量中。 我通过阅读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;

1 个答案:

答案 0 :(得分:1)

  1. 根据strtod的文档:

      

    这些函数将str_end指向的指针设置为指向解释的最后一个字符后面的字符。如果str_end为NULL,则忽略它。

    所以你的指针buffer2仍然是NULL,而你buffer1= buffer2;后 - buffer1现在也是NULL(顺便说一句,这里是内存泄漏,因为数据丢失了。

  2.   

    我是否也删除了第二个缓冲区?

    在这种情况下 - 不,因为删除NULL指针是无操作的。

  3. <强>解决方案:

    看一下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 ++的&#39; @JerryCoffin在您的问题评论中提供的解决方案。