Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MSVC 2013中共享ptr的Singleton是否正确实现? structfoo{ 国际组织; Foo(inti):i_i{std::cout_C++_Visual Studio 2013 - Fatal编程技术网

C++ MSVC 2013中共享ptr的Singleton是否正确实现? structfoo{ 国际组织; Foo(inti):i_i{std::cout

C++ MSVC 2013中共享ptr的Singleton是否正确实现? structfoo{ 国际组织; Foo(inti):i_i{std::cout,c++,visual-studio-2013,C++,Visual Studio 2013,您根本不需要指针,不管是原始指针还是共享指针,只要使用引用即可: struct Foo { int i_; Foo(int i) :i_(i) { std::cout << "Foo:" << i_ << "\n"; } ~Foo() { std::cout << "~Foo" << i_ << "\n"; } }; class FooSingleton { public: static std::

您根本不需要指针,不管是原始指针还是共享指针,只要使用引用即可:

struct Foo {
    int i_;
    Foo(int i) :i_(i) { std::cout << "Foo:" << i_ << "\n"; }
    ~Foo() { std::cout << "~Foo" << i_ << "\n"; }
};

class FooSingleton
{
public:
static std::weak_ptr<Foo> GetInstance()
{
    auto tmp = std::atomic_load(&instance);

    if (tmp == nullptr) {
        std::lock_guard<std::mutex> lock(mutex1);
        tmp = std::atomic_load(&instance);
        if (tmp == nullptr) {
            tmp = std::make_shared<Foo>(2);
            std::atomic_store(&instance, tmp);
        }
    }
    return tmp;
}
private:
static std::mutex mutex1;
static std::shared_ptr<Foo> instance;
};
structfoo{
国际组织;

Foo(inti):i_(i){std::cout如果要使用单例,我真的建议您使用。相关:您可能不需要
共享的\u ptr
。我不希望初始化实例,除非GetInstance()调用。我应该在帖子中写下它。另外,我在msvc-2013工作,在上面的链接中:msvc-2015中的支持这肯定是那些使用导致通常抱怨“单例不适合测试”的实现之一等等,因为您放弃了对单例对象生存期和硬代码线程安全惰性实例创建的控制。
shared_ptr
这里是完全没有意义的,因为对象所有权没有共享,以及互斥保护块内的原子函数。@БГБББББааааа我不想初始化实例,除非GetInstance()调用“我建议的解决方案正是这样做的”。
struct Foo {
    int i_;
    Foo(int i) :i_(i) { std::cout << "Foo:" << i_ << "\n"; }
    ~Foo() { std::cout << "~Foo" << i_ << "\n"; }
};


class FooSingleton
{
public:
static FooSingleton& GetInstance()
                // ^
{
    static FooSingleton theInstance;
    return theInstance;
}

Foo foo() {
    std::lock_guard<std::mutex> lock(mutex1);
    return Foo;
}
void foo(const Foo& value) {
    std::lock_guard<std::mutex> lock(mutex1);
    foo_ = value;
}
private:
    FooSingleton() : foo_(42) {
    }
    std::mutex mutex1;
    Foo foo_;
};