LUA XMLHttpRequest getResponseHeader 中有个bug

LUA XMLHttpRequest 中有个bug

cocos2d-x 3.0 ,源码文件frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\lua_xml_http_request.cpp
static int lua_cocos2dx_XMLHttpRequest_getResponseHeader(lua_State* L)函数中( 970行 )
auto iter = self->getHttpHeader().find(value);
if (iter != self->getHttpHeader().end())
{
tolua_pushstring(L, (iter->second).c_str());
return 1;
}

这段代码有个bug,
因为
self->getHttpHeader()
返回的是一个临时变量的map(参看定义std::map<std::string, std::string> getHttpHeader() { return _httpHeader ;}),
这个临时变量在该行代码结束时就被销毁了,导致iter失效了。
所以在lua中如果调用 getResponseHeader()就会失败。如果是debug模式的话,debugruntime会报告 Expression: map/set iterators incompatible 异常。
解决办法有2个。
1:更改std::map<std::string, std::string> getHttpHeader() { return _httpHeader ;}定义为std::map<std::string, std::string>& getHttpHeader() { return _httpHeader ;}
2:
auto iter = self->getHttpHeader().find(value);
if (iter != self->getHttpHeader().end())
{
tolua_pushstring(L, (iter->second).c_str());
return 1;
}

更改为
map<string, string> httpHeader = self->getHttpHeader();
auto iter = httpHeader.find(value);
if (iter != httpHeader.end())
{
tolua_pushstring(L, (iter->second).c_str());
return 1;
}

1赞