【问题标题】:c++ memory leak in queue initialization队列初始化中的c ++内存泄漏
【发布时间】:2013-08-12 01:05:40
【问题描述】:

最近我的公司迁移到新服务器,该程序不再正常工作。它可以编译,但是在运行时我们会在初始化队列时遇到错误和崩溃。使用 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 */

只是一些类型定义,所以下一部分不会混淆

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剪切h文件,这里是剪切cpp文件。

MIPMsgQueue() :: MIPMsgQueue() : mQueue_()
{
}

这是 valgrind sn-p。

==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 ***

感谢阅读。

【问题讨论】:

  • 用 STL 队列替换你的队列,它更有可能工作,而且我知道你不想重做你的所有代码,但我注意到你使用了很多裸指针,将它们包装在利用 RAII 的智能指针
  • 也不是向我们展示 typedef,而是将它们排除在外并自己进行替换,这样我们就必须少读
  • @aaronman 什么说队列不是 std::queue?事实上,我会说错误消息表明它是,因为 std::queue 默认使用 std::deque 引擎盖下。
  • 我看到了析构函数,但没有复制构造函数或赋值运算符。看起来像是违反三规则。
  • 如果您只使用std::queue&lt;MIPMsg&gt;,您可能会很震惊地看到它非常可能工作。该对象类中没有任何内容不支持值复制,因此除非您在某个内存限制低得离谱且每个字节都是无价之宝的嵌入式系统上,否则请让您的生活更轻松并使用基于值的队列。

标签: c++ memory-leaks gdb queue valgrind


【解决方案1】:

你说这个程序已经不能正常工作了,也就是说你没有改任何代码?如果是这样,我建议你检查一下前后的区别,比如编译条件或其他改变。

提供更多详细信息会有所帮助。

【讨论】:

    【解决方案2】:

    使用 valgrind 我可以看到队列库中的内存泄漏

    内存泄漏(通常)不会导致崩溃。这个错误:

    munmap_chunk():无效指针:0x0000000000621770 *

    暗示堆损坏,可能是由于在全局变量上调用delete。忽略内存泄漏,寻找其他 valgrind 错误(尤其是invalid free/delete)。

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2021-06-15
      相关资源
      最近更新 更多