我有如下因素代碼:這是使用引用不正確的嗎?
std::vector<A>& Get() { return some_object; };
for(int i=0; i<Get().size(); ++i) {
x->push_back(Get()[i]);
}
但我發現了垃圾值,當我第一次調用大小()。 我在想某些臨時被刪除的地方,但我不太確定... 有人能告訴我發生了什麼事嗎?
編輯:我some_object
是那麼它的這個例子
我有如下因素代碼:這是使用引用不正確的嗎?
std::vector<A>& Get() { return some_object; };
for(int i=0; i<Get().size(); ++i) {
x->push_back(Get()[i]);
}
但我發現了垃圾值,當我第一次調用大小()。 我在想某些臨時被刪除的地方,但我不太確定... 有人能告訴我發生了什麼事嗎?
編輯:我some_object
是那麼它的這個例子
如果您的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設計模式。
注意:如果您的程序是多線程的,則必須使用此技巧的變體。
這是不正確只有some_object
壽命限制爲Get
人體中不會被刪除一個靜態的載體。
哦,是的,它不是,基本上some_object是全局的 – lezebulon 2012-08-02 16:23:47
只有兩種可能 - 引用不好,或者對象本身不好。
由於引用是靜態向量,因此引用可能不好。靜態物體不會消失。
這留下了對象本身。是否有可能在靜態對象初始化之前調用該函數?如果從另一個靜態對象的構造函數中調用它,可能會發生這種情況。
我會建議替換for循環。我不相信循環。太多的地方錯誤蠕變英寸
std::vector<A>& v = Get();
x.insert(x.end(), v.begin(), v.end());
我想我們需要知道some_object回答這個問題,因爲答案取決於範圍和生命週期。 – jcoder 2012-08-02 16:23:43
如果你不改變'some_object'考慮一個'const'引用。 STL容器不是線程安全的,請確保在訪問它時大小沒有變化。否則,請確保將變量或成員保留在範圍內。 – AJG85 2012-08-02 16:24:48
可能會好,這取決於'some_object'是什麼。它活在功能之外嗎? – 2012-08-02 16:24:54