Странное поведение с std :: vector - PullRequest
1 голос
/ 22 июня 2010

рассмотрим этот сегмент кодов:

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 ]

2 голосов
/ 22 июня 2010

Вы также можете попробовать 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 голосов
/ 22 июня 2010

Поскольку и 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 голос
/ 22 июня 2010

Ваш код выглядит так? Обратите внимание на точку с запятой после второго 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;
     }
}
1 голос
/ 22 июня 2010

Попробуйте отладить ваш код.Это легко, и вы поймете, когда именно оно станет пустым.Хотя нет ничего идеального, в любом случае доверяйте таким конструкциям, как STL и другим известным библиотекам.В 99,99% случаев причиной проблемы является программист.

0 голосов
/ 22 июня 2010

Если это действительно происходит, то, скорее всего, это другой поток, модифицирующий вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...