2016-07-16 6 views
-4

Я знаю, что на C++ мы должны использовать новые и удалять, но зачем использовать malloc - это не очень хорошая идея?Вывод указателя не был выделен с помощью realloc и malloc в функции построения

+3

Здесь не так много вещей, я не знаю, с чего начать: 'malloc' размером 0; использование 'malloc' и' free' в коде C++; ненужное динамическое распределение в первую очередь. Список просто продолжается, и дальше, и на ... –

+0

Даже я пересматриваю malloc его размером 1, он все еще показывает сообщение об ошибке. C++ совместим с стилем C. Почему я не могу использовать это в C++ – beasone

+0

Я понимаю причину использования 'realloc'. Но я хочу знать, какова возможная причина, по которой вы думаете, что для блокировки мьютекса (некорректно) в конструкторе класса, где said-same изменяет только переменные-члены-экземпляры. Вы ожидаете, что несколько потоков будут строить один и тот же объект одновременно? Или что вы игнорируете упомянутый mutex в методе, который я ожидаю, что он будет зафиксирован (но не так, как вы это делаете), например, ваш метод 'add'. Если вам не нужно воспроизводить ваши результаты, избавитесь от них в своем посте. – WhozCraig

ответ

1

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 будет обрабатывать все размеры контейнера и управление памятью для вас без проблем и без суеты.

+0

Я пробовал "ataPoolBuffer = realloc (dataPoolBuffer, sizeof (char) * (dataPoolSize));" уже, но отчеты Xcode: присвоение 'char *' из несовместимого типа 'void'. – beasone

+0

@beasone Хорошая точка. Я упал на C, где этот кляп закончен. Требуется дополнительный бросок. Закрепление. – user4581301

1

Когда вы вызываете realloc(), вам нужно назначить результат обратно переменной указателя. realloc() часто требуется переместить память в новое место и возвращает это местоположение. Ваш код оставляет переменную, указывающую на старое местоположение, и вы получаете неопределенное поведение, когда пытаетесь использовать его после этого.

Так оно и должно быть:

dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize)); 

flagBuffer = (char*)realloc(flagBuffer, sizeof(char)*(dataPoolSize)); 
+0

Я пробовал "ataPoolBuffer = realloc (dataPoolBuffer, sizeof (char) * (dataPoolSize));" уже, но отчеты Xcode: присвоение 'char *' из несовместимого типа 'void'. – beasone

+0

Забыл, что C++ требует использования явного приведения. – Barmar