C++单例模式与对象池

Yu_Yang 发布于 2016/06/17 18:19
阅读 216
收藏 0
c++

下面是一个简单的单例模式和对象池实现

#include <iostream>
#include <vector>

class IntPool {
public:
    IntPool() = default;
    void Initialize(int n) {
        for (int i = 0; i < n; ++i) {
            free_.push_back(new int);
        }
    }

    int *Get() {
        if (free_.empty()) return new int;
        auto tmp = free_.back();
        free_.pop_back();
        return tmp;
    }
    void Put(int *p) {
        free_.push_back(p);
    }

    static IntPool& GetInstance(int num = 0) {
        static IntPool instance;
        if (num > 0) instance.Initialize(num);
        return instance;
    }
private:
    std::vector<int*> free_;
};

int main() {
    auto pool = IntPool::GetInstance(100);
    std::cout << pool.Get() << std::endl;
    std::cout << pool.Get() << std::endl;
    {
        auto pool = IntPool::GetInstance();
        std::cout << pool.Get() << std::endl;
    }
}



我发现第一次和第三次Get得到的地址是一样的,也就是说每当我用GetInstance重新获得pool之后,对象池中的vector似乎就重置了,让人很不解,求c++老司机指点。



加载中
0
htfy96
htfy96

IntPool::GetInstance(100);

返回的是单例的引用,类型是IntPool&, 左边auto推导的时候会剥去顶层的const和&,所以第一句实际上是

IntPool pool = IntPool::GetInstance(100);

相当于把pool持有的是单例的副本,下面同理。

正确做法是:

auto &pool = IntPool::GetInstance(100);

Yu_Yang
Yu_Yang
你是对的,非常感谢
返回顶部
顶部