2011-10-28 68 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