интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
|
|
1 | |
Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &)01.06.2013, 18:29. Показов 3128. Ответов 6
Метки нет (Все метки)
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в пользовательский тип? Ведь мы заранее не можем знать сколько в действительности может понадобиться памяти. Если у кого-то есть соображения по этому поводу, поделитесь, пожалуйста.
0
|
01.06.2013, 18:29 | |
Ответы с готовыми решениями:
6
Parse_matrix(std::istream& in); std::istream& in что это значит? Ошибка: multiple definition of `void std::swap<A>(A&, A&) Undefined reference to Rhombus::Rhombus(std::istream &) Странная ошибка: [Error] no match for call to '(std::string {aka std::basic_string<char>}) (int&)' |
Неэпический
|
|
01.06.2013, 18:39 | 2 |
Можно считывать по символу(или сразу по нескольку символов) и помещать их в строку с помощью функций членов класса String. Надеюсь, что в классе есть механизм перераспределения памяти.
Потом смотрим входной поток. Если в нем еще что-то есть, то повторяем операцию. И так до конца, либо до символа-разделителя.
1
|
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
|
||||||
01.06.2013, 19:20 [ТС] | 3 | |||||
Что-то ничего умней придумать не удалось:
0
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
01.06.2013, 19:46 | 4 |
xtorne21st, если String::operator = выкинет исключение, то будет утечка памяти.
1
|
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
02.06.2013, 01:36 | 6 |
realloc() тоже будет копировать память, если у него закончится свободное место сразу же за расширяемым куском.
Как это делается правильно: 1. String всегда выделяет память с запасом. 2. Читаем символ из потока в следующую ячейку буфера. 3. Если символы в потоке закончились, то выходим. 4. Если нет, и буфер ещё не закончился, то goto 2. 5. Если символы так и прут, а буфера уже нет, то 5.1. Выделяем в K раз больше памяти, чем есть сейчас. 5.2. Копируем/перемещаем туда всё, что есть сейчас. 5.3. Освобождаем ненужную старую память. 5.4. goto 2. Константу K обычно берут в районе 1,5 — 2 или применяют более хитрую стратегию роста.
1
|
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
|
|
02.06.2013, 03:24 [ТС] | 7 |
Всё так и сделал как вы сказали - помогло.
0
|
02.06.2013, 03:24 | |
02.06.2013, 03:24 | |
Помогаю со студенческими работами здесь
7
Error C2664: std::vector<_Ty>::push: невозможно преобразовать параметр 1 из 'double' в 'const std::string &' Ошибка: отсутствует оператор ">>"; типы операндов: std::istream >> std::string Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? Ошибка undefined reference to `operator<<(std::ostream&, Account)' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |