Да другое realloc
против std::vector
вопрос. Я знаю, что вы собираетесь сказать, и я согласен, забудьте ручное распределение памяти и просто используйте std::vector
, К сожалению, мой профессор запретил мне использовать что-либо из STL для этого задания.
Так что да, у меня есть динамический массив T
и мне нужно, чтобы он был изменяемого размера, и я не могу использовать std::vector
, Я мог бы вернуться в темные века и сделать все это с malloc
и семья, но если бы я мог использовать new
это было бы совершенно потрясающе.
Я читал множество тем, где все говорили: «Нет, ты не можешь сделать это, используй std::vector
«, но все они были опубликованы до августа 2011 года, и я надеюсь, что с момента появления C ++ 11 что-то могло измениться. Поэтому скажите, мне повезло или мне нужно вернуться к стилю C выделение памяти?
Вам следует избегать realloc
в любом случае, потому что вы не можете перемещаться по таким объектам C ++.
buf = new unsigned char[sizeof(T) * capacity]
создать новый буферunsigned char *
в T *
и использовать эти T
указатели отнынеnew
«, как в new (&buf[i]) T(original_copy)
std::uninitialized_copy
(не std::copy
), затем уничтожьте элементы старого, используя buf[i].~T()
и освободить старый буфер, используя delete [] buf
,Все это предполагает, что вам не нужно беспокоиться о безопасности исключений, что, вероятно, подходит для назначения.
Просто знайте, что в реальном коде вы должны гарантировать безопасность исключений, и это много более утомительным, чем это.
Проблема с realloc
Это может переместить существующие данные в другой диапазон смежных адресов. Если это необходимо, учитывая, что это функция C, данные копируются без каких-либо указаний на время жизни объекта C ++:
Это может привести к фатальным последствиям — например, когда перемещаемые объекты содержат указатели / ссылки, которые по-прежнему указывают на адреса в освобождаемой области памяти.
К сожалению, нормально malloc
Реализации не позволяют перехватывать вызовы, позволяя вам заменить код, копирующий содержимое памяти, вашей собственной C ++ — безопасной реализацией. Если вы полны решимости, вы можете попытаться найти более гибкую библиотеку «malloc», но она вряд ли будет стоить хлопот и рисков.
Следовательно, в общем случае вы должны использовать new
изменить свою емкость, копировать / перемещать каждый объект и delete
оригиналы потом.
Если вы уверены, что ваши данные достаточно просты, что memcpy
Перемещение в стиле не будет иметь негативных последствий, тогда вы можете использовать realloc
(на свой страх и риск).