我最近一直在玩自己的插座和缓冲器。对于以下代码,我在我的类bufferSize中分配了一个字节缓冲区。缓冲区用作环绕,因此我还跟踪缓冲区的前后索引。
在下面的代码中,我分配一个本地缓冲区,该缓冲区是类成员缓冲区的大小减去当前缓冲区中的数据,然后将套接字数据读入其中。然后,我使用前/后索引将本地缓冲区复制到类缓冲区中。
编写的代码将打印预期的数据(我正在发送测试字符串)。但是,如果我取消注释本地缓冲区上的delete [],则也会删除类缓冲区中的数据。我已经尝试使用memcpy和strcpy将数据从本地复制到类缓冲区,但无济于事。但是,如果我从不删除本地缓冲区,这是一个明显的内存泄漏。
我认为我必须遗漏一些明显和愚蠢的东西,但对于我的生活,我无法看到它是什么。
int readIntoBuffer(int timeout) {
int lbufsize = bufferSize-bytesAvailable();
byte *local_buffer = new byte[lbufsize+1];
// read into the local buffer
int bytes_read = socket->recv(local_buffer, lbufsize, timeout);
// null-terminate the local buffer
local_buffer[bytes_read] = '\0';
for (int i = 0; i < bytes_read; i++) {
// copy into class buffer, byte by byte
buffer[bufferBack] = local_buffer[i];
// update back index
bufferBack = (bufferBack + 1) % bufferSize;
}
// null-terminator at current end of class buffer
buffer[bufferBack] = '\0';
//delete[] local_buffer;
std::cout << buffer+bufferFront << std::endl;
return bytes_read;
}
答案 0 :(得分:0)
真正的问题与我原来的问题无关,我只是简单的指针管理在我的代码中创建未定义的行为。
基本上,我错误地将类成员用作另一个函数中的本地引用变量。退出函数后,类成员在超出范围时被删除。解决这个问题已经解决了上述问题。感谢大家的意见,很遗憾因为这样一个愚蠢的错误浪费你的时间!