我有以下代码:
std::vector<A>& Get() { return some_object; };
for(int i=0; i<Get().size(); ++i) {
x->push_back(Get()[i]);
}
但是当我第一次调用size()时,我得到了垃圾值。 我想某些临时删除但我不确定... 谁能告诉我发生了什么?
编辑:我的some_object
是一个静态向量,因此在此示例中它永远不会被删除
答案 0 :(得分:5)
我建议更换for循环。我不相信循环。太多的地方容易爬虫。
std::vector<A>& v = Get();
x.insert(x.end(), v.begin(), v.end());
答案 1 :(得分:3)
只有两种可能性 - 引用不好,或者对象本身不好。
由于引用是静态向量,因此引用似乎不可能是错误的。静态物体不会消失。
离开对象本身。是否有可能在静态对象初始化之前调用该函数?如果从另一个静态对象的构造函数中调用它,则可能发生这种情况。
答案 2 :(得分: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设计模式。
注意:如果您的程序是多线程的,则必须使用此技巧的变体。
答案 3 :(得分:1)
仅当some_object
生命周期仅限于Get
的正文时才会出错。