C++ in _int_malloc () from /lib64/libc.so.6 问题记录

背景

在运行 C++ 程序时出现了 Segment Fault,通过gdb 分析 core 文件,打印出如下堆栈,可以发现主要问题就是 in _int_malloc () from /lib64/libc.so.6
在这里插入图片描述

问题分析

分析代码,猜测还是因为递归函数的调用层次过深,导致内存溢出,尝试在中途结束递归过程,程序不会报错

根据Valgrind提供的信息,可以得出以下分析: 这段Valgrind信息表示在程序运行结束时,有24字节的内存块是明确丢失的。这是在294条记录的第68条记录。 这个内存块的分配是通过`operator new`函数进行的,具体是在`vg_replace_malloc.c`文件的`operator new(unsigned long, std::nothrow_t const&)`函数进行的。这个函数用于分配内存,并且使用了`std::nothrow_t`参数,表示在分配失败时不抛出异常。 这个内存块的丢失发生在`libstdc++.so.6.0.19`库文件的`__cxa_thread_atexit`函数。这个函数是C++标准库的一个线程退出钩子函数,用于在线程退出时执行清理操作。 进一步跟踪,这个内存块的丢失是在`librocksdb.so.6.20.3`库文件的`rocksdb::InstrumentedMutex::Lock()`函数发生的。这个函数是RocksDB数据库引擎的一个锁操作函数,用于获取互斥锁。 在调用堆栈,可以看到这个内存块丢失是在RocksDB数据库引擎的后台合并线程(Background Compaction)发生的。具体是在`rocksdb::DBImpl::BackgroundCallCompaction()`和`rocksdb::DBImpl::BGWorkCompaction()`函数进行的合并操作。 最后,从调用堆栈可以看到,这个内存块的丢失是在后台线程发生的。这是在`librocksdb.so.6.20.3`库文件的`rocksdb::ThreadPoolImpl::Impl::BGThread()`和`rocksdb::ThreadPoolImpl::Impl::BGThreadWrapper()`函数执行的。 综上所述,根据Valgrind的信息分析,这段代码存在一个明确的内存泄漏问题,24字节的内存块在后台合并线程丢失。需要进一步检查代码,确保在合适的时机释放这些内存块,以避免资源泄漏和潜在的问题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值