免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1739 | 回复: 5
打印 上一主题 下一主题

[C++] C++11 的一个问题,不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-18 15:46 |只看该作者 |倒序浏览

  1. #include<memory>
  2. #include<mutex>
  3. #include<stdio.h>


  4. class DataHandler
  5. {
  6.     public:
  7.         ~DataHandler(){}

  8.         static DataHandler* GetInstance()
  9.         {
  10.             static std::once_flag flag;
  11.             std::call_once(flag,[&]{m_instance = new DataHandler();});
  12.             return m_instance;
  13.         }

  14.         void test()
  15.         {
  16.             printf("hello \n");
  17.         }
  18.     private:
  19.         DataHandler(){}
  20.         static DataHandler* m_instance;

  21. };
  22. DataHandler* DataHandler::m_instance = nullptr;


  23. int main()
  24. {

  25.     DataHandler *h = DataHandler::GetInstance();

  26.     h->test();


  27. }
复制代码
g++   test.cpp -o test -lstdc++ -std=c++11

一运行就core 了
terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
Aborted (core dumped)

std::call_once(flag,[&]{m_instance = new DataHandler();});  这句。



不太明白。 求解答,谢谢!

论坛徽章:
0
2 [报告]
发表于 2016-08-18 15:51 |只看该作者
gdb 错误如下

std::call_once<DataHandler::GetInstance()::{lambda()#1}>(std:nce_flag&, DataHandler::GetInstance()::{la
~                                                                                                        │mbda()#1}&& (__once=...,
~                                                                                                        │    __f=<unknown type in /home/toptrade/yantao/code/dataHandler, CU 0x0, DIE 0x343a>
~                                                                                                        │    at /usr/include/c++/6.1.1/mutex:608
~                                                                                                        │608               std::forward<_Args>(__args)...);

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2016-08-18 16:15 |只看该作者
我用的是 mingw-w64,gcc版本是6.1.0
没问题呀,即使 h 是空指针也没问题。

论坛徽章:
0
4 [报告]
发表于 2016-08-18 17:12 |只看该作者
本帖最后由 sytpb 于 2016-08-18 17:13 编辑

gcc (GCC) 6.1.1 20160602

│Copyright (C) 2016 Free Software Foundation, Inc.

那就是我Gcc 没有问题了。 奇怪

论坛徽章:
0
5 [报告]
发表于 2016-08-18 18:11 |只看该作者
本帖最后由 sytpb 于 2016-08-18 18:12 编辑

问题 我解决了。
编译加上  -lpthread  运行就不报错了。 好奇怪啊。


g++   test.cpp -o test -lstdc++ -std=c++11  -lpthread

另外贴一个singleton 实现

http://www.nuonsoft.com/blog/201 ... e-1/#comment-263121

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [报告]
发表于 2016-08-19 08:38 |只看该作者
-lpthread 是必须加的,它其实靠pthread实现的
-std=c++11 不如改为 -std=c++17

你贴的那个链接被墙了,我直接贴出代码
  1. #include <memory>
  2. #include <mutex>

  3. class CSingleton
  4. {
  5. public:
  6.     virtual ~CSingleton() {}
  7.     static CSingleton& GetInstance();

  8. private:
  9.     static std::unique_ptr<CSingleton> m_instance;
  10.     static std::once_flag m_onceFlag;
  11.     CSingleton(void) {}
  12.     CSingleton(const CSingleton& src);
  13.     CSingleton& operator=(const CSingleton& rhs);
  14. };

  15. std::unique_ptr<CSingleton> CSingleton::m_instance;
  16. std::once_flag CSingleton::m_onceFlag;

  17. CSingleton& CSingleton::GetInstance()
  18. {
  19.     std::call_once( m_onceFlag, []{m_instance.reset(new CSingleton);} );
  20.     return *m_instance.get();
  21. }

  22. int main( void )
  23. {
  24.     CSingleton& a = CSingleton::GetInstance();
  25.     CSingleton& b = CSingleton::GetInstance();
  26.     printf( "%p\n", &a );
  27.     printf( "%p\n", &b );

  28.     return 0;
  29. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP