2016-06-28 2 views
1

Рассмотрите официальное сообщение documentation за libuv (раздел прочие коммунальные платежи).
Это декларация uv_buf_init:libuv и uv_buf_init: кто должен освобождать что?

uv_buf_t uv_buf_init(char* base, unsigned int len) 

В документации говорится, что (курсив мой):

Конструктор для uv_buf_t.

Из-за различий в платформе пользователь не может рассчитывать на упорядочение базовых и len-элементов структуры uv_buf_t. Пользователь несет ответственность за освобождение базы после выполнения uv_buf_t. Возвращаемая структура передается по значению.

Мне кажется, что base может быть освобожден сразу же после звонка в uv_buf_init.

С другой стороны, A uv_buf_t структура is documented, как состоит из двух полей: base, что имеет тип char * и len, что имеет тип size_t.

Что не ясно мне:

  • копируются данные более в буфер? (Ну, я думаю, ответ отрицательный, поскольку это было бы большим штрафом с точки зрения производительности).

  • Должен ли я освобождать данные после вызова uv_try_write или других функций *_write? То есть, как только данные действительно потребляются.

+0

Вы должны использовать valgrind для проверки или чтения исходного кода, если документации недостаточно. Кроме того, различия между платформами в том, где они фактически хранятся, кажутся мне неактуальными. –

+0

@self Прочитайте источник и да: документации недостаточно (это действительно ужасно). – skypjack

ответ

0

Данные не копируются в uv_buf_t, uv_buf_t.base относится к тому же массив символов, используемых для его создания.
Из-за этого у вас нет штрафов за производительность, но также вы не можете сбросить данные сразу после звонка до uv_buf_init.
Вместо этого вы можете освободить их, если у вас есть буфер, то есть (в качестве примера), когда вы отправили его в uv_write или uv_try_write.

0

Не беспокойтесь о struct, но беспокоитесь о том, на что он указывает.

Если функция вы передаете uv_buf_t к используется в асинхронном режиме память, uv_buf_t.base указывает на сусло не быть освобожденной до обратного вызова не вызывается.

Даже аннулирование запросов на выполнение, таких как uv_write_t (при вызове на рукоятке), не препятствует вызову обратных вызовов, поэтому безопасно выполнять очистку.