我就奇怪了,没有释放dll中的开辟的堆内存啊??

cs60089 2009-03-14 04:17:29
#include <string>

#include <boost/regex.hpp>
#include <boost/lambda/lambda.hpp>

using namespace std;
using namespace boost;

#pragma warning (disable : 4290)

void GetHostNameFromRequest(const string& HttpHead,string& hostname) throw (string)
{

boost::regex rHostname("(?<=Host: )[\\s\\S]*?(?=\r\n)");
std::string::const_iterator begin,end;
smatch sm;

hostname.clear();
begin=HttpHead.begin();
end=HttpHead.end();

regex_search(begin,end,sm,rHostname);
hostname=sm[0];
if(hostname.size()<=0)
{
cout<<&HttpHead<<endl;
throw HttpHead;
}
}



int _tmain(int argc, _TCHAR* argv[])
{
try
{
string a;
GetHostNameFromRequest("dd",a);
}
catch(string b)
{
cout<<&b<<endl;
}
cout<<"done"<<endl;
system("pause");
return 0;
}


我把GetHostNameFromRequest放在一个dll中,再在main 中调用就有问题了
出问题的地方是string b的析构
我就觉得奇怪了,throw就相当于return
catch(string b)
就相当于把HttpHead复制构造到b,这时跳出catch{}时析构的是b,而不是HttpHead,应该来说没有错啊????
...全文
119 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
videosender 2009-03-14
  • 打赏
  • 举报
回复
throw HttpHead;
在抛出异常的时候,会拷贝构造一个string, 这个时候就会申请堆内存
异常处理结束的时候,就需要析构这个string对象,需要释放堆内存
跨模块释放了堆内存,就会出错了。
cs60089 2009-03-14
  • 打赏
  • 举报
回复
up
cs60089 2009-03-14
  • 打赏
  • 举报
回复
顺便问问,函数的反回值放在进程空间的哪里?
栈区?
堆区?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧