C++11 的一个问题,不解
#include<memory>
#include<mutex>
#include<stdio.h>
class DataHandler
{
public:
~DataHandler(){}
static DataHandler* GetInstance()
{
static std::once_flag flag;
std::call_once(flag,[&]{m_instance = new DataHandler();});
return m_instance;
}
void test()
{
printf("hello \n");
}
private:
DataHandler(){}
static DataHandler* m_instance;
};
DataHandler* DataHandler::m_instance = nullptr;
int main()
{
DataHandler *h = DataHandler::GetInstance();
h->test();
}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();});这句。
不太明白。 求解答,谢谢!
gdb 错误如下
std::call_once<DataHandler::GetInstance()::{lambda()#1}>(std::once_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)...);
我用的是 mingw-w64,gcc版本是6.1.0
没问题呀,即使 h 是空指针也没问题。 本帖最后由 sytpb 于 2016-08-18 17:13 编辑
gcc (GCC) 6.1.1 20160602
│Copyright (C) 2016 Free Software Foundation, Inc.
那就是我Gcc 没有问题了。 奇怪 本帖最后由 sytpb 于 2016-08-18 18:12 编辑
问题 我解决了。
编译加上-lpthread运行就不报错了。 好奇怪啊。
g++ test.cpp -o test -lstdc++ -std=c++11-lpthread
另外贴一个singleton 实现
http://www.nuonsoft.com/blog/2012/10/21/implementing-a-thread-safe-singleton-with-c11/comment-page-1/#comment-263121 -lpthread 是必须加的,它其实靠pthread实现的
-std=c++11 不如改为 -std=c++17
你贴的那个链接被墙了,我直接贴出代码#include <memory>
#include <mutex>
class CSingleton
{
public:
virtual ~CSingleton() {}
static CSingleton& GetInstance();
private:
static std::unique_ptr<CSingleton> m_instance;
static std::once_flag m_onceFlag;
CSingleton(void) {}
CSingleton(const CSingleton& src);
CSingleton& operator=(const CSingleton& rhs);
};
std::unique_ptr<CSingleton> CSingleton::m_instance;
std::once_flag CSingleton::m_onceFlag;
CSingleton& CSingleton::GetInstance()
{
std::call_once( m_onceFlag, []{m_instance.reset(new CSingleton);} );
return *m_instance.get();
}
int main( void )
{
CSingleton& a = CSingleton::GetInstance();
CSingleton& b = CSingleton::GetInstance();
printf( "%p\n", &a );
printf( "%p\n", &b );
return 0;
}
页:
[1]