c++ - 单例类的成员变量的生命周期是多少?

标签 c++ memory singleton static-members

class Member {
public:
    Member(int idx) {
        this->idx_ = idx;
    }

    int get_idx() {
        return idx_;
    }

    void set_idx(int idx) {
        this->idx_ = idx;
    }

    void foo();

private:
    int idx_;
};


class SingletonClass {
public:
    static SingletonClass& GetInstance() {
        static SingletonClass inst;
        return inst;
    }

    vector<Member*> get_members() {
        return this->members_;
    }

    Member* get_member(int idx) {
        return this->members_[idx];
    }

    void add_member(Member* mem) {
        this->members_.push_back(mem);
    }

private:
    SingletonClass() {}
    vector<Member*> members_;
};

void Member::foo() {
    SingletonClass inst = SingletonClass::GetInstance();
    cout << inst.get_members().size();
}


int main() {  
    SingletonClass inst = SingletonClass::GetInstance();
    inst.add_member(new Member(0));
    inst.add_member(new Member(1));
    cout << inst.get_members().size() << endl;

    Member* mem = inst.get_member(1);
    mem->foo();
    return 0;
}

输出为

2
0

看来,当我在Member::foo()中获取SingletonClass的实例时,SingletonClass的成员变量 vector members_是已清除...任何人都可以向我解释为什么以及如何发生这种情况吗?我该如何修复它以获得预期结果?非常感谢!

最佳答案

It seems that when I get the instance of SingletonClass inside Member::foo(), the member variable vector members_ of SingletonClass is cleared... Can anyone explain to me why and how this happen? And how can I fix it to get expected result?

您正在以下行中创建对象的拷贝:

SingletonClass inst = SingletonClass::GetInstance();

然后您正在修改拷贝的内容。原始对象保持不变。

用途:

SingletonClass& inst = SingletonClass::GetInstance();

为了防止这种情况在代码中的其他地方发生,请显式删除复制构造函数和复制赋值运算符。

private:
    SingletonClass() {}
    SingletonClass(SingletonClass const&) = delete;
    SingletonClass& operator=(SingletonClass const&) = delete;
    vector<Member*> members_;

关于c++ - 单例类的成员变量的生命周期是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32146151/

相关文章:

ipad - 内存超过40MB时,基于Unity的应用程序在iPad 1上崩溃

java - Java 单例类中的 Volatile 字段

C++ 删除引用

c++ - 如何抑制来自 UBsan 的一些无符号整数溢出错误?

c++ - 如何像junit一样使用cppunit——两条主线

java - 容纳唯一编号的最小(尺寸)物体?

c++ - 为什么用新语法 `noexcept` 重写旧的空抛出规范?

c++ - 为什么VS Debug版本将变量分配得这么远?

c++ - 单例构造函数失败 C++ - 可以是什么?

java - 单例和静态工厂方法有什么区别