sytpb 发表于 2016-08-18 15:46

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();});这句。



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

sytpb 发表于 2016-08-18 15:51

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)...);

bruceteen 发表于 2016-08-18 16:15

我用的是 mingw-w64,gcc版本是6.1.0
没问题呀,即使 h 是空指针也没问题。

sytpb 发表于 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 没有问题了。 奇怪

sytpb 发表于 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/2012/10/21/implementing-a-thread-safe-singleton-with-c11/comment-page-1/#comment-263121

bruceteen 发表于 2016-08-19 08:38

-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]
查看完整版本: C++11 的一个问题,不解