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

使用C++RestSdk发起请求后为何触发SIGSEGV错误?

分析你的程序退出SIGSEGV问题

这个崩溃场景在cpprestsdk(Casablanca)的使用中挺常见的,我帮你拆解几个可能的原因和对应的解决方案:

1. 不符合标准的main函数签名

你写的main()在C标准里属于未定义行为——C强制要求main函数必须返回int,也就是int main()。虽然部分编译器会宽松处理这种写法,但不标准的签名可能导致程序退出阶段的栈清理、资源回收逻辑异常,进而触发SIGSEGV。这是最容易修复的点。

2. 变量名笔误(疑似输入错误)

代码里定义了const std::string URI = "...";,但构造http_client时却用了U(newURI)——newURI是未定义的变量。如果你实际运行的代码确实是这样,应该会编译失败,但你说请求能正常执行,所以大概率是粘贴代码时的笔误,实际代码里是U(URI)。不过还是要确认这一点,避免潜在的未定义行为。

3. cpprestsdk的资源回收时机问题

cpprestsdk内部依赖线程池处理异步操作,哪怕你调用了.wait()等待请求完成,全局线程池的资源可能会在main函数退出后才开始销毁。此时如果某些栈上对象已经被释放,就会触发内存访问错误。

针对这个问题,你可以尝试:

  • 在main结束前显式重置http_client,强制提前释放资源:
    client = http_client(); // 重置client,触发内部资源清理
    
  • 确保所有cpprestsdk相关对象(client、config、request)都在main函数栈上,保证它们的生命周期覆盖整个请求流程。

4. 旧版本cpprestsdk的已知bug

如果你使用的是2.10版本之前的cpprestsdk,存在一些http_client销毁时的线程安全问题,会导致程序退出时崩溃。建议升级到最新稳定版本,或者查看官方issue列表确认是否是已知问题。

修正后的示例代码

这里给你调整了main签名、修正变量名,并加上了显式资源清理的版本:

#include <iostream>
#include <cpprest/http_client.h>
#include <thread>

int main(){ // 修正main返回类型
    const std::string URI = "https://192.168.13.141/v1/testing/stats/add";
    // 配置跳过证书验证
    http_client_config config;
    config.set_validate_certificates(false);
    // 创建http客户端 - 修正变量名错误
    http_client client(U(URI), config);
    // 认证信息
    const std::string token = "Bearer testToken";
    const std::string authTag = "Authorization";
    // 构造请求
    http_request request;
    request.headers().add(authTag, token);
    request.set_method(methods::GET);
    
    client.request(request).then([](http_response response) {
        std::cout << response.to_string() << std::endl;
    }).wait();

    // 显式重置客户端,提前清理内部资源
    client = http_client();

    return 0;
}

优先试试修正main函数签名,这是最可能快速解决问题的方法,如果还是崩溃,再尝试升级库或者显式重置client。

内容的提问来源于stack exchange,提问作者José Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:43:43