Выделение памяти realloc

195
23 мая 2018, 03:40

Всем привет! Есть такой код, перегрузка оператора ввода в собственном классе строки, пишу для изучения:

 friend istream& operator>>(istream& stream, MyString& input_string) {
     char* input_data = nullptr;
     int counter = 0;
     char symbol;
     while (true) {
         if ((symbol = stream.get()) != '\n') {
             input_data = (char* )realloc(input_data, ++counter);
             static int a = strlen(input_data);
             input_data[counter - 1] = symbol;
         } 
         else {
             input_data[counter] = 0;
             break;
         }
     }
     input_string.string = input_data;
     input_string.size = input_string.length();
     return stream;
 }

Ожидалось, что переменная a после первого вызова станет равна 1, и после каждого последующего вызова realloc в цикле будет увеличиваться на единицу. Однако, Visual Studio 2013 считает по-другому, и выделяет сразу 16 байт памяти, а после 4-х итераций как раз-таки выделяет по одному байту. Таким образом получается, что всегда в запасе есть лишние 12 байт мусора... Собственно вопрос - дело в компиляторе? Или где-то мой косяк? Спасибо.

Answer 1

Функция strlen определяет длину строки и ограничена нахождением первого нулевого байта.
Вместо size_t strlen(char const*) предлагаю использовать size_t _msize(void*) в Windows или size_t malloc_usable_size(void*) в Linux, обе функции находятся в <malloc.h>. Таким образом вы узнаете выделены объем памяти.

READ ALSO
Member types в с++

Member types в с++

Нигде не могу найти пояснение по вопросу "Что такое member types(типы-члены) в с++?", в документации тоже про них ничего не нашелВозможно, тут подскажете

221
Поиск в файле txt

Поиск в файле txt

Хочу сделать поиск в файле по количеству комнат и диапазону цен, всё по запросу пользователяЕсть пока лишь это

230
epoll полностью грузит ядро?

epoll полностью грузит ядро?

Вызов epoll_wait() по сути производит активное ожидание на переданных дескрипторах в течении таймаутаВопрос, то есть он полностью убивает одно...

202
Настройка клиента и сервера, ZeroMQ

Настройка клиента и сервера, ZeroMQ

Возникла необходимость написать обмен данными, между python и C++Работает все в локал хосте

212