2012-08-02 64 views
1

我有如下因素代碼:這是使用引用不正確的嗎?

std::vector<A>& Get() { return some_object; }; 

for(int i=0; i<Get().size(); ++i) { 
    x->push_back(Get()[i]); 
} 

但我發現了垃圾值,當我第一次調用大小()。 我在想某些臨時被刪除的地方,但我不太確定... 有人能告訴我發生了什麼事嗎?

編輯:我some_object是那麼它的這個例子

+2

我想我們需要知道some_object回答這個問題,因爲答案取決於範圍和生命週期。 – jcoder 2012-08-02 16:23:43

+1

如果你不改變'some_object'考慮一個'const'引用。 STL容器不是線程安全的,請確保在訪問它時大小沒有變化。否則,請確保將變量或成員保留在範圍內。 – AJG85 2012-08-02 16:24:48

+0

可能會好,這取決於'some_object'是什麼。它活在功能之外嗎? – 2012-08-02 16:24:54

回答

2

如果您的for循環是在全局或靜態對象的構造函數的上下文中執行的,那麼您將遇到稱爲static initialization order fiasco(SIOF)的問題。簡而言之,SIOF意味着我們不能依賴靜態對象的構建順序。

要解決此問題,可以使用construct on first use成語。有了這個習慣用法,您可以在需要時首次構建靜態/全局對象。這可以確保相互依賴的靜態對象在訪問時將被創建。

對於你的榜樣,你可以做這樣的事情:

std::vector<A>& Get() 
{ 
    // 'instance' will be constructed "on demand" the first time this 
    // function is called. 
    static std::vector<A> instance; 
    return instance; 
}; 

這招也可以用來實現Singleton設計模式。

注意:如果您的程序是多線程的,則必須使用此技巧的變體。

1

這是不正確只有some_object壽命限制爲Get人體中不會被刪除一個靜態的載體。

+0

哦,是的,它不是,基本上some_object是全局的 – lezebulon 2012-08-02 16:23:47

3

只有兩種可能 - 引用不好,或者對象本身不好。

由於引用是靜態向量,因此引用可能不好。靜態物體不會消失。

這留下了對象本身。是否有可能在靜態對象初始化之前調用該函數?如果從另一個靜態對象的構造函數中調用它,可能會發生這種情況。

5

我會建議替換for循環。我不相信循環。太多的地方錯誤蠕變英寸

std::vector<A>& v = Get(); 
x.insert(x.end(), v.begin(), v.end());