一个不起眼的手误,让我调了半小时
来源:互联网 发布:程序员逆袭之路txt 编辑:程序博客网 时间:2024/04/20 11:36
一个不起眼的手误,让我调了半小时,大家最好先别看解析部分,自己练一下眼里吧。
运行是报段错误:
(3077573488) starting up(3077573488) is exiting段错误
下面给出错误代码:
1 #include <ace/Task.h> 2 #include <ace/Log_Msg.h> 3 #include <ace/Thread_Manager.h> 4 5 class ExitHandler : public ACE_At_Thread_Exit { 6 public: 7 virtual void apply (void) { 8 ACE_DEBUG ((LM_DEBUG, 9 ACE_TEXT ("(%t) is exiting\n"))); 10 // Shutdown all devices. 11 } 12 }; 13 14 class MyThread : public ACE_Task_Base { 15 public: 16 MyThread (ExitHandler &eh) : eh_(eh) {} 17 virtual int svc () { 18 ACE_DEBUG ((LM_DEBUG, 19 ACE_TEXT ("(%t) starting up\n"))); 20 21 this->thr_mgr ()->at_exit (eh_); 22 23 // Do something. 24 ACE_OS::sleep (1); 25 26 // Forcefully exit (); 27 ACE_Thread::exit (); 28 29 // Not reached. 30 return 0; 31 } 32 private: 33 ExitHandler eh_; 34 }; 35 36 37 int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { 38 ExitHandler eh; 39 40 MyThread thread (eh); 41 thread.activate (); 42 43 ACE_Thread_Manager::instance ()->wait (); 44 return 0; 45 }
解析:
第33行应该声明为引用,即
33 ExitHandler &eh_;
出现段错误的原因:
原因在于ACE_At_Thread_Exit的构造函数和析构函数
默认够在函数:
ACE_At_Thread_Exit::ACE_At_Thread_Exit (void) : next_ (0), td_ (0), was_applied_ (false), is_owner_ (true){}
析构函数:
ACE_At_Thread_Exit::~ACE_At_Thread_Exit (void){ this->do_apply ();}
ACE_At_Thread_Exit::do_apply()函数的定义:
void ACE_At_Thread_Exit::do_apply (void){ if (!this->was_applied_ && this->is_owner_) td_->at_pop();}
可以看到,在默认构造函数中,was_applied_初始化为false,is_owner_初始化为true,而td_初始化为空指针。如果我们使用默认构造函数实例化了一个ACE_At_Thread_Exit类(或其子类)的实例,如果此实例没有被使用,则在实例销毁时将调用td_->at_pop()函数,由于td_为空指针,此行调用将会报段错误。
如果ACE_At_Thread_Exit类的实例被应用到某个ACE_Thread_Manager,则线程退出时将会设置was_applied_为false,这样析构函数中将不再调用td->at_pop()函数。
结论:这应该是ACE的一个bug吧,一个不能随便实例化的类,太危险了,使用时需格外小心。
- 一个不起眼的手误,让我调了半小时
- textarea文字怪异的居中让我头疼了半小时
- 一个不起眼的公告
- 一个不起眼的小问题
- 一个隐蔽的数组访问越界的问题(竟然纠结半小时,有可能是我水平太低了)
- 给我一份缘,让我握住你的手
- 一个踢了一刻钟 一个上场半小时 中超U23球员的尴尬
- 儒学让我变成了一个理想主义者
- Fedora下瞎折腾了一个半小时,还是Sun的虚拟机可靠
- 马云缺席的一个半小时,李彦宏和马化腾都聊了什么
- 一个让我敬佩的,并且教会了我东西的师弟
- 一个让我找了半天的低级错误,知道真相的我眼泪掉下来
- 看了半小时的MVC,总结下
- 收藏一个经典图片,太经典了,让我想起了我的历史书!
- RefreshLayout让你半小时以内完成一个列表界面
- 一个字让你从新手成为合格的程序员
- 一个不起眼的问题导致性能的严重的下降
- 一个不起眼的错误可能会纠缠你很久
- 转: Precompilation Run Script in Xcode 4
- typeid详解
- 代码风格的问题
- Django笔记-Admin
- 一些VC的快捷键以及调试方法技巧
- 一个不起眼的手误,让我调了半小时
- php获取MAC地址
- JGroups的协议栈
- 工程师解读:为何华为手机“干不过”小米(1)
- Django笔记-Models
- 养殖美国金鸽,提高农业产业化建设的水平
- strcasecmp
- C++第十六周【任务一】涨工资(文件的读入)
- Sencha Touch中如何alert显示一个sencha对象?