延迟初始化
delayed initialization?
谁能解释一下为什么会这样?我写了以下内容:
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");
则一切正常。如果有人能说明一下这个情况,我将不胜感激。
这里有一个快速的例子来说明这个问题:
#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
导致内部数据的重新分配。这将使重新分配之前获得的指向vector元素的所有引用、指针或迭代器失效。
相关文章:
- 模板化类中静态成员的延迟初始化
- 我的子类的属性是延迟初始化的
- 在声明或实现中延迟初始化C++单一实例
- 使用 lambda 和可变参数模板延迟初始化对象 - 任意传递值
- 保证非 odr 使用的全局变量的延迟动态初始化
- 延迟第三方库中静态变量的初始化
- 成员变量的初始化必须延迟。此类的最佳设计选择是什么?
- C++11:对延迟初始化进行安全的双重检查锁定.可能的
- gcc中模板的非延迟静态成员初始化
- 本地静态对象的非延迟初始化
- 私有类成员延迟初始化的最佳做法
- 无锁代码中的延迟初始化
- 模板和延迟初始化
- 是否可以在初始化列表中使用延迟指针
- 带有转发的延迟初始化
- 有没有一种方法可以延迟初始化类的静态子对象
- 堆栈对象的延迟初始化
- c++类成员和延迟初始化
- 延迟初始化缓存..我如何使它线程安全
- 延迟初始化