最近我的公司迁移到新服务器,这个程序不再正常工作。编译好了,但是在运行时我们会在初始化队列时遇到错误和崩溃。使用valgrind我可以看到队列库中的内存泄漏。代码要大得多,但很难把它全部放在这里,所以我尽量减少我认为合理的代码。我认为可能有一个问题我无法看到有关版本或其他什么,有人可以建议提示/帮助吗?
typedef unsigned char byte;
typedef unsigned char boolean;
typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;
typedef signed long int int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */
只是某种类型的defs所以下一部分不会混淆
struct MIPMsg
{
byte msg[1024];
uint32 msglen;
uint32 ipaddr;
ushort sin_port;
uint32 MNHomeAddr;
struct timeval ts;
MIPMsg() : msglen(0), ipaddr(0), sin_port(0) , MNHomeAddr(0)
{
memset( msg, '\0', sizeof(msg) );
}
};
class MIPMsgQueue {
public:
MIPMsgQueue();
~MIPMsgQueue();
private:
queue<MIPMsg*> mQueue_;
};
这是h cut h文件,这是剪切的cpp文件。
MIPMsgQueue() :: MIPMsgQueue() : mQueue_()
{
}
这是valgrind片段。
==25753== at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==25753== by 0x4045C6: __gnu_cxx::new_allocator<MIPMsg**>::allocate(unsigned long, void const*) (new_allocator.h:88)
==25753== by 0x4045F9: std::_Deque_base<MIPMsg*, std::allocator<MIPMsg*> >::_M_allocate_map(unsigned long) (stl_deque.h:424)
==25753== by 0x404B23: std::_Deque_base<MIPMsg*, std::allocator<MIPMsg*> >::_M_initialize_map(unsigned long) (stl_deque.h:471)
==25753== by 0x404C70: std::_Deque_base<MIPMsg*, std::allocator<MIPMsg*> >::_Deque_base(std::allocator<MIPMsg*> const&, unsigned long) (stl_deque.h:368)
==25753== by 0x404D0D: std::deque<MIPMsg*, std::allocator<MIPMsg*> >::deque(std::deque<MIPMsg*, std::allocator<MIPMsg*> > const&) (stl_deque.h:690)
==25753== by 0x404E20: std::queue<MIPMsg*, std::deque<MIPMsg*, std::allocator<MIPMsg*> > >::queue(std::deque<MIPMsg*, std::allocator<MIPMsg*> > const&) (stl_queue.h:146)
==25753== by 0x4033E2: MIPMsgQueue::MIPMsgQueue() (MIPMsgQueue.cpp:5)
这里也是gdb错误代码
munmap_chunk(): invalid pointer: 0x0000000000621770 ***
感谢阅读。
答案 0 :(得分:0)
使用valgrind我可以看到队列库中的内存泄漏
内存泄漏(通常)不会导致崩溃。这个错误:
munmap_chunk():指针无效:0x0000000000621770 *
意味着堆损坏,可能是由于在全局变量上调用delete
。忽略内存泄漏,并查找其他 valgrind错误(特别是invalid free/delete
)。
答案 1 :(得分:0)
你说这个程序不再正常,这意味着你不会改变任何代码?如果是这样,我建议你检查之前和之后的差异,比如编译条件或其他变化
提供更多详细信息将有所帮助。