You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未调用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:54:27