今天在做加载favico时(由于某些网站根据user_agent对favico的取做了屏蔽,古要在前的基础上加user——agent项),先是这样做的,
std::string user_agent;
pView->GetUserAgent(user_agent);
下面是GetUserAgent接口
void GetUserAgent(std::string& user_agent)
{
user_agent.assign("User-Agent: " + WideToUTF8(g_WinInetEvents.GetUserAgent().GetBuffer(g_WinInetEvents.GetUserAgent().GetLength())));
g_WinInetEvents.GetUserAgent().ReleaseBuffer();
}
当调用GetUserAgent的作用域结束的时候会发生异常,异常的现实是heapfree出错。经盘查发现:
传进去的user_agent的空间在小与将要赋值的长度的时候,将会发生重新分配空间。在赋值。而在调用作用域结束的时候释放的时候,释放
的是我们在作用域中定义的user_agent。
解决办法一:
修改GetUserAgent接口,使其返回应用
std::string& GetUserAgent()
{
m_user_agent = "User-Agent: " + WideToUTF8(g_WinInetEvents.GetUserAgent().GetBuffer(g_WinInetEvents.GetUserAgent().GetLength()));
//user_agent.assign("User-Agent: " + WideToUTF8(g_WinInetEvents.GetUserAgent().GetBuffer(g_WinInetEvents.GetUserAgent().GetLength())));
g_WinInetEvents.GetUserAgent().ReleaseBuffer();
return m_user_agent;
}
解决办法二
void CAliBrowserView:: GetUserAgent(std::string** user_agent)
{
m_user_agent = "User-Agent: " + WideToUTF8(g_WinInetEvents.GetUserAgent().GetBuffer(g_WinInetEvents.GetUserAgent().GetLength()));
//user_agent.assign("User-Agent: " + WideToUTF8(g_WinInetEvents.GetUserAgent().GetBuffer(g_WinInetEvents.GetUserAgent().GetLength())));
g_WinInetEvents.GetUserAgent().ReleaseBuffer();
*user_agent = &m_user_agent;
//return m_user_agent;
}
然后
std::string user_agent = pView->GetUserAgent();
观察发现:
两个接口唯一的不同就是一个参数是引用,一个返回值是应用。
总结:
参数是引用:引用一旦绑定后是不可以改变的,指针是可以的;你传进去的是4个字节的,当发现空间不足的时候重新分配了,此时发生了改变。
返回值是应用:
返回后绑定,不存在问题