Я знаю, что на C++ мы должны использовать новые и удалять, но зачем использовать malloc - это не очень хорошая идея?Вывод указателя не был выделен с помощью realloc и malloc в функции построения
ответ
According to the documentation,
realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
перераспределяет dataPoolBuffer
, но не изменяет, где dataPoolBuffer
точки. Так что довольно неплохо, что dataPoolBuffer
теперь указывает на недопустимую память.
dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
будет делать то, что вы хотите, но переосмыслить, как вы это делаете. Вы настраиваете себя на большую боль. Your class violates The Rule of Three, for one thing.std::vector будет обрабатывать все размеры контейнера и управление памятью для вас без проблем и без суеты.
Я пробовал "ataPoolBuffer = realloc (dataPoolBuffer, sizeof (char) * (dataPoolSize));" уже, но отчеты Xcode: присвоение 'char *' из несовместимого типа 'void'. – beasone
@beasone Хорошая точка. Я упал на C, где этот кляп закончен. Требуется дополнительный бросок. Закрепление. – user4581301
Когда вы вызываете realloc()
, вам нужно назначить результат обратно переменной указателя. realloc()
часто требуется переместить память в новое место и возвращает это местоположение. Ваш код оставляет переменную, указывающую на старое местоположение, и вы получаете неопределенное поведение, когда пытаетесь использовать его после этого.
Так оно и должно быть:
dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
flagBuffer = (char*)realloc(flagBuffer, sizeof(char)*(dataPoolSize));
Здесь не так много вещей, я не знаю, с чего начать: 'malloc' размером 0; использование 'malloc' и' free' в коде C++; ненужное динамическое распределение в первую очередь. Список просто продолжается, и дальше, и на ... –
Даже я пересматриваю malloc его размером 1, он все еще показывает сообщение об ошибке. C++ совместим с стилем C. Почему я не могу использовать это в C++ – beasone
Я понимаю причину использования 'realloc'. Но я хочу знать, какова возможная причина, по которой вы думаете, что для блокировки мьютекса (некорректно) в конструкторе класса, где said-same изменяет только переменные-члены-экземпляры. Вы ожидаете, что несколько потоков будут строить один и тот же объект одновременно? Или что вы игнорируете упомянутый mutex в методе, который я ожидаю, что он будет зафиксирован (но не так, как вы это делаете), например, ваш метод 'add'. Если вам не нужно воспроизводить ваши результаты, избавитесь от них в своем посте. – WhozCraig