Всем привет! Есть такой код, перегрузка оператора ввода в собственном классе строки, пишу для изучения:
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 байт мусора...
Собственно вопрос - дело в компиляторе? Или где-то мой косяк? Спасибо.
Функция strlen определяет длину строки и ограничена нахождением первого нулевого байта.
Вместо size_t strlen(char const*) предлагаю использовать size_t _msize(void*) в Windows или size_t malloc_usable_size(void*) в Linux, обе функции находятся в <malloc.h>. Таким образом вы узнаете выделены объем памяти.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости