未调用的make_shared<string>引发程序Segment Fault问题排查
Pulsar C++客户端未调用函数却触发段错误问题解决
问题情况
在使用Pulsar C++客户端的程序中,即便从未调用包含shared_ptr<string> t = make_shared<string>("")的func()函数,程序仍会出现段错误(core dump)。移除该语句或改用shared_ptr<string> t(new string(""))后,程序恢复正常运行。
代码示例
#include <pulsar/Client.h> using namespace pulsar; using namespace std; void func() { shared_ptr<string> t = make_shared<string>("");// 该语句存在时程序崩溃,即使func未被调用 } int main(){ shared_ptr<string> t; Client client("pulsar://xxx"); Producer producer; Result result = client.createProducer("topic_xxx", producer); if (result != ResultOk) { std::cout << "Error creating producer: " << result << std::endl; return -1; } }
编译命令
g++ report_main.cpp -I../libs/pulsar/include -lpulsar
调试排查结果
- 移除
func()中的make_shared语句时,Pulsar客户端内部调用make_shared会正常触发内存分配器(allocator),数据操作无异常; - 保留该语句时,客户端内部的
make_shared未触发allocator,最终导致Pulsar的SharedBuffer构造时出现内存访问越界,崩溃堆栈指向__memcpy_ssse3_back。
原因分析
这是由于模板实例化的静态初始化冲突导致的:虽然func()未被执行,但其中的make_shared<string>语句会触发std::make_shared模板针对std::string的提前实例化。该实例化代码与Pulsar客户端内部依赖的make_shared实现(或其关联的内存分配器逻辑)产生冲突,破坏了Pulsar内部内存分配器的正常初始化流程,进而引发内存越界访问。
解决方案
- 直接移除未被调用的
func()函数,或者删除其中的make_shared<string>("")语句; - 将
make_shared<string>("")替换为shared_ptr<string>(new string("")),绕过冲突的模板实例化路径; - 检查编译环境,确保程序使用的标准库版本与Pulsar客户端编译时依赖的标准库版本一致(比如避免混用不同版本的libstdc++),消除因标准库实现差异带来的冲突。
内容的提问来源于stack exchange,提问作者david zhang
相关产品推荐
相关产品推荐

