有人可以解释为什么会这样吗?我写了以下内容:
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");
然后一切都按预期工作。如果有人能够对这种情况有所了解,那么我们将非常感谢任何帮助。
答案 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
导致内部重新分配数据。这会使您在重新分配之前获得的向量元素的所有引用,指针或迭代器无效。