Подтвердить что ты не робот

Что такое С++-версия realloc(), чтобы выделить новый буфер и скопировать содержимое из старого?

В C мы использовали malloc(), free(), но в С++ вы используете new, delete, но в C мы также имеем realloc, который будет выделять новый блок и копировать старые данные (общий минимум), а затем освобождать старые данные bock. Итак, что такое версия на С++? Конечно, я могу написать свои собственные, но есть ли встроенная вещь?

main() {
  int i; char *x = malloc(3);
  x[0] = 10;
  x[1] = 20;
  x[2] = 30;
  realloc(x, 4);
  x[3] = 40;
  for (i = 0; i < 4; i++) printf("%i\n", x[i]);
}
4b9b3361

Ответ 1

Там нет new/delete эквивалент realloc в С++.

Из Часто задаваемые вопросы по Bjarne Stroustrup:

Почему у С++ нет эквивалента realloc()?

Если вы хотите, вы можете, конечно, использовать realloc(). Однако realloc() только гарантированно работает на массивы, выделенные malloc() (и аналогичные функции), содержащие объекты без пользовательских конструкторов копирования. Кроме того, помните, что вопреки наивным ожиданиям realloc() иногда копирует свой массив аргументов. В С++ лучший способ рассмотрение перераспределения заключается в использовании стандартного библиотечного контейнера, такого как как вектор, и пусть он естественным образом растет.

Если вы хотите изменить размер контейнера, просто используйте std::vector, иначе оставайтесь с malloc, realloc и free.

И, чтобы ответить на ваш последний вопрос, версия С++ для вашего кода будет выглядеть следующим образом:

main() {
    std::vector<char> x(3);
    x[0] = 10;
    x[1] = 20;
    x[2] = 30;
    x.resize(4);
    x[3] = 40;
    for (int i = 0; i < 4; i++) std::cout << x[i] << std::endl;
}

Ответ 2

Посмотрим, что думает Бьярне Страуструп!

Почему у С++ нет эквивалента realloc()?

Если вы хотите, вы можете, конечно, использовать realloc(). Однако realloc() только гарантированно работает на массивы, выделенные malloc() (и аналогичные функции), содержащие объекты без пользовательских конструкторов копирования. Кроме того, помните, что вопреки наивным ожиданиям realloc() иногда копирует свой массив аргументов.

В С++ лучшим способом решения проблемы перераспределения является использование стандартного библиотечный контейнер, такой как вектор, и пусть он естественным образом растет.

Ответ 3

realloc не используется в С++, потому что С++ хочет использовать свои копии и стандартные конструкторы и деструкторы для подобных вещей в целом. Но если у вас есть простые старые типы, с которыми вы хотите работать как можно быстрее, нет причин не откатывать свой собственный класс массивов, который делает то, что вы хотите. Я удивлен, что нет ни одной, которая в основном совместима с STL уже на верхней странице Google.

Ответ 4

С++ не имеет эквивалента new/delete C realloc.

Вероятная причина (хотя она не упоминается нигде в стандарте) связана с конструкторами, которые могут бросать: как это должно вести себя, если при перераспределении конструктор бросает? Обработка этого случая лучше всего оставить программисту, потому что нет истинного ответа.