Форум программистов, компьютерный форум CyberForum.ru

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нужно вынести часть программы в отдельный модуль http://www.cyberforum.ru/cpp-beginners/thread887500.html
Помогите вынести 19-36 строки в отдельный модуль, чтобы можно было потом как заголовочный файл .h его подключить #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <fstream> #include <map> using namespace std; int main() {
C++ Однозвязный список через template Помогите разобрать код в тех местах где я поставил //???? . Код не мой, и указатели я не очень хорошо понимаю. #include <iostream> using namespace std; /////////////////////////////////////////// template <class T> struct element { element* next; http://www.cyberforum.ru/cpp-beginners/thread887472.html
Классы: составить описание объектного типа Matrix (инициализации единичной, квадратных матриц, сложение, транспонирование, вычисление определителя) C++
Составить описание объектного типа Matrix, обеспечивающего инициализации единичной матрицы, квадратных матриц, сложение матриц, транспонирование, вычисление определителя матрицы.
C++ Получить строку, в которой наибольшее число знаков препинания
Дан текстовый файл. Получить строку, в которой наибольшее число знаков препинания.
C++ Подключение статической библиотеки (libxls) http://www.cyberforum.ru/cpp-beginners/thread887465.html
Здравствуйте, недавно столкнулся с необходимостью читать из .xls файла, нашел для этого библиотеку libxls. В их readme написано, что они "A multiplatform, C/C++ library for parsing Excel(TM) files." (то есть я так понял что в винду в проект с плюсами это запихнуть можно), однако в архиве с названием "Win32 binary: libxls-0.2.0-win32.tar.gz" (судя по всему для винды?) лежат хедеры и файл .a,...
C++ где моду прочитать о деревьях с нуля? где моду прочитать о деревьях с нуля? подробнее

Показать сообщение отдельно
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.06.2013, 19:20  [ТС]     Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &)
Что-то ничего умней придумать не удалось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::istream& operator>>(std::istream& stream, String& x)
{
    int i, size = 1;
    char* buff = (char*)malloc(size++);
    char ch;
 
    for (i = 0; stream.get(ch) && ch != '\n' ; ++i)
    {
        buff[i] = ch;
        buff = (char*)realloc(buff, size++);
    }
    if (i != 0)
    {
        buff[i] = 0;
        x = buff;
    }
 
    free(buff);
    return stream;
}
как мне кажется, этот вариант не очень удачный, так как используется вместо new функция malloc/realloc. А иначе можно б было создать вспомогательный конструктор для внутреннего объекта класса String (так как он в качестве деструктора использует оператор delete, а не free()) и просто присвоить текущему указателю новый объект, и не прибегать к вызову перегруженного оператора =, который заново выделяет память. Хотя с другой стороны постоянное выделения новой памяти и перекопирование старого значения в новую память также расходная операция и ко всему прочему реализация при помощи malloc/realloc - проще.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru