2011-10-28 65 views
0

有人可以解释为什么会发生这种情况吗?我已经写了以下情况:延迟初始化?

1),其被实现为独立的,并具有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

问题是,在'createWindow'中,我返回了一个对栈上创建的对象的引用,当方法结束时这个对象被销毁了。 将'windows_'从'std :: vector '更改为'std :: vector '并修改其他所有内容相应地解决了我的问题。 –

+0

那不是你的原因,但那会解决真正的问题 –

+0

请阅读下面的内容:http://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289#1008289 –

回答

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"); 
} 

编译并运行,因为它是,看看打印到标准输出。 然后取消注释reserve()调用,编译并再次运行并与之前的输出进行比较。

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

+2

Std :: deque不会遭受这个问题,并且几乎和大多数目的的矢量一样快。 –

+0

谢谢!与此同时,我设法通过改变我的向量来处理指向对象的指针。在经理类中持有一系列对象的首选C++方法是什么?对象的容器,或指向对象的指针的容器? –

+0

请参阅@MooingDuck评论。此外,你可以有一个混合:shared_ptr集合。 – mloskot