reallo c против memcpy в динамическом c массиве, как вектор в C - PullRequest
1 голос
/ 08 апреля 2020

Я использовал вектор структуры данных в C. Например,

struct intVector 
{
  int* head;

  size_t capacity;
  size_t size;
};

При реализации функции pushIntVector у меня есть два варианта, когда размер массива равен емкости. В этом случае мне нужно выделить больший объем памяти и скопировать в него все данные и освободить старые выделенные данные. Как говорит do c, функция reallo c перераспределяет память для ptr, а функция memcpy копирует память из A в B.

На первый взгляд, reallo c кажется мне подходящим, поскольку я не нужно позаботиться о копировании памяти и освобождении старой, но что делать, если в линейном режиме такой большой памяти нет. С другой стороны, если я где-нибудь запомню c какую-то большую память, я смогу найти ее и легко скопировать в нее и освободить старую. Поэтому здесь я не могу понять, что использовать в моем случае.

1 Ответ

3 голосов
/ 08 апреля 2020

Особенно при работе с памятью важно очень внимательно прочитать документацию. Проще говоря, reallo c может вести себя тремя способами, когда запрашивает больше памяти, чем выделено в данный момент:

  • Расширение выделенной области при сохранении исходного содержимого без изменений
  • Выделение нового блок памяти и копирование существующих данных
  • Сбой (обычно, но не всегда, из-за ошибки нехватки памяти)

Оба результата без ошибок оба покидают память содержит исходные данные и никогда не потребует memcpy. Так что в этом случае вам обязательно следует использовать reallo c без memcpy. Если вы столкнетесь с регистром сбоя с помощью reallo c, вы попадете в регистр сбоя с помощью mallo c. Хорошей практикой является проверка возврата всех функций управления памятью и при сбое освобождает все программные ресурсы и завершает работу корректно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...