std :: vector的奇怪行为

时间:2010-06-22 10:05:42

标签: c++ vector

考虑这段代码:

std::vector<int> vecList;

...populate 3 elements into vecList...

if (!vecList.empty())
{
     std::cout << "List count = " << vecList.size() << std::endl;
     if (vecList.empty())
     {
          std::cout << "List is empty" << std::endl;
     }
}

我的打印输出是:

List count = 3
List is empty

除了打印外,我没有对“vecList”做任何事情,但是在我打印出矢量的大小之后,大小变为0.这怎么可能?任何建议都表示赞赏。

当我在Iphone环境中运行构建时,就会发生这种情况。

由于 亚历山大

5 个答案:

答案 0 :(得分:2)

由于std::vector<>empty()std::vector<>::size()都是const成员函数,并且无法改变向量的内容,因此我可以看到获得该结果的唯一方法是使用多个线程或调用未定义的行为。

可能的候选者是修改向量的其他线程,并通过缓冲区溢出等来搞乱向量的内部。

这个

#include <iostream>
#include <vector>

int main ()
{
    std::vector<int> vecList;

    vecList.push_back(1);
    vecList.push_back(2);
    vecList.push_back(3);

    if (!vecList.empty())
    {
        std::cout << "List count = " << vecList.size() << std::endl;
        if (vecList.empty())
        {
            std::cout << "List is empty" << std::endl;
        }
    }

    return 0;
}

为我打印List count = 3。我打赌它对你也一样。如果是这样,那么在您未显示的代码中必定会出现一些问题。

找出它是什么的唯一方法(除了在这里发布完全正确的片段并让某人猜对了)是逐步删除所有额外的代码,直到问题消失,然后查看触发它的代码。

答案 1 :(得分:2)

您可能还想尝试Valgrind。分配使用未初始化的值,尤其是系统调用会导致真正奇怪的行为。

例如,一个常见的错误是以下(是的,我自己犯了这个错误):

struct timeval tv;
tv.tv_sec = 5;

// This is supposed to sleep for 5 seconds
select(0, NULL,NULL,NULL, &tv);

缺少什么?您需要初始化结构的第二个成员tv.tv_usec = 0;,否则它可能会导致程序中完全不相关的部分出现看似随机的错误。 Valgrind可以帮助你抓住这些东西。

答案 2 :(得分:1)

尝试对您的代码进行调试。它很容易,你会明白它什么时候变空。虽然,没有任何理想,但无论如何信任像STL和其他知名图书馆这样的结构。在99.99%的案例中,问题的原因是程序员。

答案 3 :(得分:1)

看起来像这样的代码?请注意第二个if之后的分号。

std::vector<int> vecList;

...populate 3 elements into vecList...

if (!vecList.empty())
{
     std::cout << "List count = " << vecList.size() << std::endl;
     if (vecList.empty());
     {
          std::cout << "List is empty" << std::endl;
     }
}

答案 4 :(得分:0)

如果实际发生这种情况,很可能是修改矢量的另一个线程。