我有一个关于分配和释放内存的问题。
我想在循环中读取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;
答案 0 :(得分:1)
根据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 ++的&#39; @JerryCoffin在您的问题评论中提供的解决方案。