0

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

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

1 回答 1

1
  1. 根据以下文档strtod

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

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

  2. 我也要删除第二个缓冲区吗?

    在这种情况下 - 不,因为删除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:查看@JerryCoffin 在对您的问题的评论中建议的优雅且非常“类似 C++”的解决方案。

于 2017-02-03T16:39:50.673 回答