2013-12-02 2 views
0

Я просто писал еще одну программу. И используется:Ошибка с while (cin)

while (cin) 
    words.push_back(s); 

words является vector из string, s является string.

Объем использования ОЗУ по сравнению с 4 или 5 входами, SWAP начал заполняться. Я использую ubuntu? Я просто не понимаю, как такой простой код может вызвать такие плохие последствия. Или что-то не так с моей системой?

EDIT: Полная программа:

#include <iostream> 
#include <vector> 
#include <string> 

using std::cin; 
using std::cout; 
using std::endl; 
using std::string; 
using std::vector; 

int main() 
{ 
    vector<string> words; 
    string s; 

    cout << "Enter the string: "; 
    while (cin) 
     words.push_back(s); 

    for (vector<string>::const_iterator iter = words.begin(); 
     iter != words.end(); ++iter) 
     cout << *iter; 

    return 0; 
} 
+6

Пожалуйста, покажите полную программу испытаний, которые мы можем использовать, чтобы дублировать эту проблему для себя. – zwol

+0

Вместо этого используйте 'emplace_back', я сомневаюсь, что это причина. – Shoe

+8

Не думаю, что вы где-то добываете строку 's'? Как 'while (cin >> s)' ?? Как написано, 'cin' не модифицируется вашей петлей, поэтому я могу представить, что это будет работать в течение очень долгого времени. – WhozCraig

ответ

1

В своем коде, у вас есть while (cin), который будет повторяться вечно. Это приведет к тому, что вы вставляете в вектор большое количество пустых строк. Вы никогда не пытаетесь ничего читать со стандартного ввода - в основном вы заканчиваете бесконечным циклом, проверяя статус cin (что будет хорошо, пока вы не убьете поток), поэтому вы в конечном итоге пытаетесь выделить огромное количество пространства для пустых строк.

Что вы имели в виду, чтобы написать это:

while (cin >> s) 
    words.push_back(s); 

или

std::copy(std::istream_iterator<std::string>(std::cin), 
      std::istream_iterator<std::string>(), 
      std::back_inserter(words)); 

Side Примечание: В любом случае, если вы собираетесь использовать cin снова в какой-то другой момент в программе, вы будете необходимо очистить его состояние ошибки и сбросить его буфер.

+0

+1 Лучшее объяснение того, что не так с исходной программой. – zwol

0

Тестирование для успеха CIN или GetLine, безусловно, является хорошей практикой. Конечно, есть структурные проблемы с тем, что вы показали нам, так как я не вижу, где что-то заполняется. Я бы порекомендовал getline над cin для строковых вводов. Это намного проще. Возможно, у таких советов есть сотни вопросов о том, почему стандартный ввод приводит к странному поведению. Часто это результат не тестирования на успех или не очистки символов конца строки при использовании cin как для ввода цифр, так и для строк. Мне нравится следующий веб-сайт для простых вопросов и ответов о потоках/выходах.

http://www.parashift.com/c++-faq/input-output.html

Вполне возможно, что вы видите проблемы с памятью, потому что у вас есть непрерывный цикл. Поскольку я не вижу, как изменится состояние входного потока, вы, вероятно, будете вставлять свой вектор в тысячи раз. Что такое s? Является ли это NULL-строкой или что вы опубликовали неполным?

1

Это обычная плохая практика и ошибка для проверки состояния потока, а не проверки результата извлечения.

Следовательно, это:

if(cin >> x) { ... } 
else { 
    // Error 
} 

для форматированного ввода.

(Пожалуйста, извиниться не отвечая на ideone пост)

Смежные вопросы