管道和字符串流-在字符串流中写入时内存泄漏
pipe and stringstream - memory leak when writing in the stringstream
当我试图在字符串流对象中写入二进制数据时,我的代码出现内存问题。Valgrind日志(首次用系统监视器发现):
==23562== 16,368 bytes in 1 blocks are possibly lost in loss record 1,612 of 1,612
==23562== at 0x402A6DC: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==23562== by 0x4C72213: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
==23562== by 0x4C73332: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
==23562== by 0x4C733D1: std::string::reserve(unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
==23562== by 0x4C4E1FF: std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow(int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
==23562== by 0x4C52AEC: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
==23562== by 0x4C48E8D: std::ostream::write(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
**==23562== by 0x8140EAC: MsgMgt::update_stream() (MsgMgt.cpp:524)**
==23562== by 0x814192E: MsgMgt::thread() (MsgMgt.cpp:727)
==23562== by 0x807614E: dlib::threaded_object::thread_helper() (threaded_object_extension.cpp:256)
==23562== by 0x80EBEC2: void dlib::dlib_create_new_thread_helper<dlib::threaded_object, &dlib::threaded_object::thread_helper>(void*) (create_new_thread_extension.h:24)
==23562== by 0x80768C3: dlib::threads_kernel_shared::thread_starter(void*) (threads_kernel_shared.cpp:272)
以下函数(udpate流)检查另一个进程和当前进程之间的管道,并将管道内容写入stringstream对象中,从而导致内存泄漏:
(为了清楚起见,我删除了非必要的代码)
std::stringstream _outputstream;
unsigned int MsgMgt::update_stream()
{
fd_set set;
struct timeval timeout;
//Number of bytes read on the pipe
ssize_t read_bytes=0;
/* Initialize the file descriptor set. */
FD_ZERO(&set);
FD_SET(_fd[0], &set);
FD_SET(_fd_stop[0], &set); //allowing to stop the select
/* Initialize the timeout data structure. */
timeout.tv_sec = _timeout;
timeout.tv_usec = 0;
int ret;
errno=0;
if(!should_stop()){
ret = select(FD_SETSIZE, &set, NULL, NULL, &timeout);
if (ret > 0){
if(FD_ISSET(_fd[0],&set)){
//ACTIVITY ON THE PIPE
char* buffer=new char[DATA_MAX_LENGTH];
errno=0;
//Data transfer process pipe to _outputstream
read_bytes = read(_fd[0],buffer,DATA_MAX_LENGTH); //None blocking read
if(read_bytes<0 && errno !=EAGAIN){
//Error in read
}else{
//write the data in the stringstream
//supposed memory leak
_outputstream.write(buffer,read_bytes);
}
delete[] buffer;
}
}
}
return read_bytes;
}
我不明白发生了什么。有什么想法吗?
谢谢你,
皮埃尔。
如果_outputstream.write
抛出异常,缓冲区将被泄漏。
您可以使用智能指针来存储指向缓冲区的指针,也可以使用向量作为缓冲区。两种解决方案都会在出现异常时自动删除它。
相关文章:
- 将字符串存储在c++中的稳定内存中
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 字符串共享内存映射的向量
- C++将字符串传递给 C 库以进行内存管理
- 内存增加和字符串流?
- 如何从内存中读取字符串?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- Adobe 字符串内存泄漏 - 在哪里调用外部库入口点以释放内存?
- std ::字符串内存泄漏
- C++字符串内存重用优化
- Visual C++2013 std::字符串内存泄漏
- 动态分配 C 字符串内存,无需先询问用户输入时间
- SDL_TTF 绘制 int 到字符串内存泄漏
- C++减少了字符串内存的使用
- 如何将字符串内存地址(如 "7fefe05a8")存储在 C++ 中的指针/int 变量中,以便我可以对其进行位屏蔽?
- 基本的c风格字符串内存分配
- C/ c++字符串内存分配
- 使用字符串内存
- 在字符串内存分配中可能存在内存泄漏