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不可用的情况。 - 解决步骤:
- 将
HttpUtil改为继承UObject的类(如果还不是),利用UE的垃圾回收机制管理对象生命周期。 - 使用
BindUObject替代BindRaw,它会自动检查对象是否有效,避免空指针访问:request->OnProcessRequestComplete().BindUObject(this, &HttpUtil::OnResponseReceived); - 确保
HttpUtil对象在回调执行期间保持存活。如果是局部对象,需要将其提升为UObject成员变量,或者用TSharedPtr/TWeakPtr管理生命周期,在回调中先检查对象是否有效。 - 调试时遇到
this不可用的提示,优先检查对象是否被提前销毁,可在类的构造/析构函数中添加日志确认生命周期。
- 将
内容的提问来源于stack exchange,提问作者MashedPotato6587
相关产品推荐
相关产品推荐

