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

UE4 C++类成员变量_Token在HTTP回调中为空问题排查

问题:HTTP回调中类成员变量_Token为空的调试问题

我把令牌值存在类变量_Token里,CreateHttpPostRequest方法会把这个令牌加到请求头。在PostToJira方法里调用CreateHttpPostRequest发起HTTP请求,把响应绑定到OnResponseReceived回调。收到响应后调用AddScreenshot方法,这个方法会再次调用CreateHttpPostRequest给Jira问题加截图(只能给已存在的问题加,所以必须先创建问题再执行后续操作)。

现在的问题是调用AddScreenshot时,_Token的值是空的。调试时监视窗口显示:

c++ Stopped in a C++ method, but 'this' isn't available; pretending we are in a generic context. error: use of undeclared identifier '_Token'

我试过用BindLambda替代BindRaw,也试过在头文件直接定义_Token的值(不是通过AuthMan::GetToken(_Token)获取),还用过this->_Token,但问题还是没解决。

简化后的代码

HttpUtil.h

class HttpUtil
{
public:
    bool PostToJira();
    
private:    
    void AddScreenshot() const;
    
    void OnResponseReceived(FHttpRequestPtr request, FHttpResponsePtr response, bool bConnectedSuccessfully) const;
    
    TSharedRef<IHttpRequest, ESPMode::ThreadSafe> CreateHttpPostRequest() const;
    
    FString _Token = "my_token";
};

HttpUtil.cpp

bool HttpUtil::PostToJira()
{    
    const FHttpRequestRef request = CreateHttpPostRequest();
    request->OnProcessRequestComplete().BindRaw(this, &HttpUtil::OnResponseReceived);
    request->ProcessRequest();
    return true;
}

void HttpUtil::AddScreenshot() const
{
    const FHttpRequestRef request = CreateHttpPostRequest();
    request->ProcessRequest();
}

void HttpUtil::OnResponseReceived(FHttpRequestPtr request, FHttpResponsePtr response, bool bConnectedSuccessfully) const
{
    AddScreenshot();
}

TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpUtil::CreateHttpPostRequest() const
{
    TSharedRef<IHttpRequest, ESPMode::ThreadSafe> request = FHttpModule::Get().CreateRequest();
    request->SetURL("http://echo.jsontest.com/key/value/one/two");

    // 当AddScreenshot调用此函数时,_Token为空
    UE_LOG(LogConsoleResponse, Warning, TEXT("_Token = %s"), *_Token);
    return request;
}

问题分析与解决思路

  • 核心原因:UE的HTTP回调执行时,HttpUtil对象可能已经被销毁,导致this指针失效,访问_Token时出现未定义行为。BindRaw不会管理对象生命周期,回调触发时如果对象已被释放,就会出现this不可用的情况。
  • 解决步骤:
    1. 将HttpUtil改为继承UObject的类(如果还不是),利用UE的垃圾回收机制管理对象生命周期。
    2. 使用BindUObject替代BindRaw,它会自动检查对象是否有效,避免空指针访问:
      request->OnProcessRequestComplete().BindUObject(this, &HttpUtil::OnResponseReceived);
      
    3. 确保HttpUtil对象在回调执行期间保持存活。如果是局部对象,需要将其提升为UObject成员变量,或者用TSharedPtr/TWeakPtr管理生命周期,在回调中先检查对象是否有效。
    4. 调试时遇到this不可用的提示,优先检查对象是否被提前销毁,可在类的构造/析构函数中添加日志确认生命周期。

内容的提问来源于stack exchange,提问作者MashedPotato6587

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:52:02