我有以下代码:
std::vector<A>& Get() { return some_object; };
for(int i=0; i<Get().size(); ++i) {
x->push_back(Get()[i]);
}
但是当我第一次调用 size() 时,我得到了垃圾值。我在想一些临时的被删除了,但我不太确定......有人可以告诉我发生了什么吗?
编辑: mysome_object
是一个静态向量,所以在这个例子中它永远不会被删除
我建议更换 for 循环。我不相信 for 循环。虫子爬进来的地方太多了。
std::vector<A>& v = Get();
x.insert(x.end(), v.begin(), v.end());
只有两种可能——引用是坏的,或者对象本身是坏的。
由于引用是对静态向量的引用,因此引用似乎不太可能是坏的。静态对象不会消失。
这留下了对象本身。是否有可能在初始化静态对象之前调用该函数?如果它是从另一个静态对象的构造函数中调用的,则可能会发生这种情况。
如果您的 for 循环是在全局或静态对象的构造函数的上下文中执行的,那么您将遇到称为静态初始化顺序失败(SIOF) 的问题。简而言之,SIOF 意味着我们不能依赖于静态对象的构造顺序。
为了解决这个问题,您可以使用第一次使用习语的构造。使用这个习惯用法,您可以在第一次需要静态/全局对象时懒惰地构造它们。这确保了在访问它们时将创建相互依赖的静态对象。
对于您的示例,您可以执行以下操作:
std::vector<A>& Get()
{
// 'instance' will be constructed "on demand" the first time this
// function is called.
static std::vector<A> instance;
return instance;
};
这个技巧也用于实现单例设计模式。
注意:如果你的程序是多线程的,你必须使用这个技巧的一个变种。
仅当some_object
生命周期仅限于Get
.