多线程对象生命期提问

兔子和猫搅基 2014-09-16 05:38:39
我是刚入行的小白,真心求教:
问题描述:
class Father
{
Father(){ /*构造函数*/ };
~Father(){ /*析构函数*/ };
print(/*打印*/);
};;
void thread_work(Father& a)
{
a.print(); //####提问:这里为什么会调用析构?
}
int main()
{
std::thread th(thread_work);
th.join();
}
补充:改为 void thread_work(Father* a); 就可以了,
原型是客户端发数据,因为调用析构,所以服务端接收到2个网络指令了,拜托大神解疑啦,感谢感谢!

还有 能不能说下这属于哪方面知识呢?
...全文
122 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo_包子 2014-09-18
  • 打赏
  • 举报
回复
这个我看了汇编,他是在check stack的时调用的析构,编译器的世界太难懂。
兔子和猫搅基 2014-09-18
  • 打赏
  • 举报
回复
FancyMounse ,感谢你,原来是这样。
兔子和猫搅基 2014-09-18
  • 打赏
  • 举报
回复
嘿嘿,感谢上面的回答啊,真心有帮助, 其实我在vc2012上调试, 输出是这样: 构造 我是类 析构 析构 析构 析构 这里有main线程 和 thread_work()运行的线程, 先创建线程thread_work()中执行print();main()线程调用外部(可能是编译器) 执行一次析构,thread_work()正好执行完了,main()中还是没有执行join(); 继续调用外部(可能是编译器)进行析构,这个操作一共做了四遍,之后才join()。 真是是编译器对引用做了些操作,涉及对象生命期,它会自己进行优化, 指针就不会,看来还是用指针啊!嘿嘿,感谢大家!
FancyMouse 2014-09-18
  • 打赏
  • 举报
回复
std::thread mythread(rhread_work,fafa); => std::thread mythread(rhread_work,std::ref(fafa)); 你原来的代码传的是副本(即使函数签名是引用,建立std::thread本身的时候传进去的就是拷贝,函数参数引用的是那个拷贝)。等thread结束了当然一个析构。
兔子和猫搅基 2014-09-17
  • 打赏
  • 举报
回复
完整点: #include <thread> //定义类 class Father{ public: Father(){ printf("构造函数\n"); } ~Father(){ printf("析构函数\n"); } void print(){ printf("我是类!\n"); } } //线程处理函数 void thread_work(Father& a) //这里用了引用 { a.point(); //打印 } //主函数 int main() { //创建对象 Father fafa; //创建线程对象 std::thread mythread(rhread_work,fafa); //这里传入了线程处理函数,及其参数 mythread.join(); //等待子线程结束 return 0; } 上面在进入现程函数时thread_work()会调用一次Father类的析构, 想知道原因啊,但是修改线程处理函数为 thread_work(Father* fa); 就不会调用析构了,这里是为什么呢?
赵4老师 2014-09-17
  • 打赏
  • 举报
回复
《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
Kenney_Qin 2014-09-17
  • 打赏
  • 举报
回复
代码貌似不完整
jiuchang 2014-09-17
  • 打赏
  • 举报
回复
引用的话由编译器根据引用计数来判断什么时候释放对象 当它发现a在调用a.print后没有再使用了,就可能触发释放操作 而对于指针,它没办法进行这样的判断
兔子和猫搅基 2014-09-17
  • 打赏
  • 举报
回复
非常感谢上面的回答啊,不过就是想听个直白点的理由。
jiuchang 2014-09-16
  • 打赏
  • 举报
回复
你线程运行的函数是怎么传递进去的呢?代码里没看到

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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