динамическое распределение памяти — эквивалент Realloc в переполнении стека

Да другое realloc против std::vector вопрос. Я знаю, что вы собираетесь сказать, и я согласен, забудьте ручное распределение памяти и просто используйте std::vector, К сожалению, мой профессор запретил мне использовать что-либо из STL для этого задания.

Так что да, у меня есть динамический массив T и мне нужно, чтобы он был изменяемого размера, и я не могу использовать std::vector, Я мог бы вернуться в темные века и сделать все это с malloc и семья, но если бы я мог использовать new это было бы совершенно потрясающе.

Я читал множество тем, где все говорили: «Нет, ты не можешь сделать это, используй std::vector«, но все они были опубликованы до августа 2011 года, и я надеюсь, что с момента появления C ++ 11 что-то могло измениться. Поэтому скажите, мне повезло или мне нужно вернуться к стилю C выделение памяти?

6

Решение

Вам следует избегать 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,

Все это предполагает, что вам не нужно беспокоиться о безопасности исключений, что, вероятно, подходит для назначения.
Просто знайте, что в реальном коде вы должны гарантировать безопасность исключений, и это много более утомительным, чем это.

7

Другие решения

Проблема с realloc Это может переместить существующие данные в другой диапазон смежных адресов. Если это необходимо, учитывая, что это функция C, данные копируются без каких-либо указаний на время жизни объекта C ++:

  • конструкторы копирования / перемещения не используются
  • деструкторы не вызываются впоследствии для исходных объектов

Это может привести к фатальным последствиям — например, когда перемещаемые объекты содержат указатели / ссылки, которые по-прежнему указывают на адреса в освобождаемой области памяти.

К сожалению, нормально malloc Реализации не позволяют перехватывать вызовы, позволяя вам заменить код, копирующий содержимое памяти, вашей собственной C ++ — безопасной реализацией. Если вы полны решимости, вы можете попытаться найти более гибкую библиотеку «malloc», но она вряд ли будет стоить хлопот и рисков.

Следовательно, в общем случае вы должны использовать new изменить свою емкость, копировать / перемещать каждый объект и delete оригиналы потом.

Если вы уверены, что ваши данные достаточно просты, что memcpyПеремещение в стиле не будет иметь негативных последствий, тогда вы можете использовать realloc (на свой страх и риск).

6

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector