1

我有以下代码:

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

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

但是当我第一次调用 size() 时,我得到了垃圾值。我在想一些临时的被删除了,但我不太确定......有人可以告诉我发生了什么吗?

编辑: mysome_object是一个静态向量,所以在这个例子中它永远不会被删除

4

4 回答 4

5

我建议更换 for 循环。我不相信 for 循环。虫子爬进来的地方太多了。

std::vector<A>& v = Get();
x.insert(x.end(), v.begin(), v.end());
于 2012-08-02T16:54:08.237 回答
3

只有两种可能——引用是坏的,或者对象本身是坏的。

由于引用是对静态向量的引用,因此引用似乎不太可能是坏的。静态对象不会消失。

这留下了对象本身。是否有可能在初始化静态对象之前调用该函数?如果它是从另一个静态对象的构造函数中调用的,则可能会发生这种情况。

于 2012-08-02T16:35:19.827 回答
2

如果您的 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;
};

这个技巧也用于实现单例设计模式。

注意:如果你的程序是多线程的,你必须使用这个技巧的一个变种。

于 2012-08-02T16:44:34.757 回答
1

仅当some_object生命周期仅限于Get.

于 2012-08-02T16:23:10.240 回答