延迟初始化?

时间:2011-10-28 00:01:39

标签: c++ singleton reference

有人可以解释为什么会这样吗?我写了以下内容:

1)一个WindowManager类,它实现为一个单例,并且有一个Instance()方法,定义如下:

static WindowManager * instance_;
//...
WindowManager * WindowManager::instance_ = 0;
WindowManager & WindowManager::Instance()
{
    if (!instance_)
        instance_ = new WindowManager();
    return *instance_;
}

2)一个WindowManager::createWindow方法,它返回对新创建的窗口的引用,定义如下:

Window & WindowManager::createWindow()
{
    windows_.push_back(Window());
    return windows_.at(windows_.size() - 1);
}

3)在窗口内打印消息的Window::print方法

在我的主程序中,我写了以下内容:

ui::Window & win1 = ui::WindowManager::Instance().createWindow();
ui::Window & win2 = ui::WindowManager::Instance().createWindow();
win1.print("First window");
win2.print("Second window");

这不起作用!仅执行对print的第二次调用(对于win2)。 但是,如果我改变顺序,就像这样:

ui::Window & win1 = ui::WindowManager::Instance().createWindow();
win1.print("First window");
ui::Window & win2 = ui::WindowManager::Instance().createWindow();
win2.print("Second window");

然后一切都按预期工作。如果有人能够对这种情况有所了解,那么我们将非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

这里有一个快速举例说明问题:

#include <iostream>
#include <vector>
using namespace std;

struct T
{
    int id;
    T(int id) : id(id)
       { cout << "created " << id << endl; }
    T(T const& t) : id(t.id)
       { cout << "copy: " << t.id << endl; }
    void print(char const* m)
       { cout << id << ": " << m << endl; }
};

vector<T> ts;

T& create(int id)
{
    ts.push_back(T(id));
    return ts.at(ts.size() - 1);
}

int main()
{
    // Uncomment these lines and compare results
    //int const max_windows = 10;
    //ts.reserve(max_windows);

    T& t1 = create(1);
    T& t2 = create(2);
    t1.print("t1");
    t2.print("t2");
}

编译并按原样运行,并查看打印到stdout的内容。 然后取消注释reserve()调用,再次编译并运行并与之前的输出进行比较。

问题是std::vector::push_back导致内部重新分配数据。这会使您在重新分配之前获得的向量元素的所有引用,指针或迭代器无效。