Жизнь объекта в обвязке C

allocate, initialise, free
Выделить, инициализировать, освободить

В обвязке C создание объекта разбито на два вызова — выделение и инициализацию, — чтобы отличать нехватку памяти от прочих ошибок: …Alloc возвращает нулевой указатель, если памяти нет, а инициализация — PmtaConnConnectRemote, PmtaMsgInit, PmtaRcptInit — сообщает об остальном.

По окончании объект освобождают функцией …Free; освобождение соединения заодно закрывает его. Получателя освобождают всегда — и после добавления в письмо, иначе память утекает.

Отсюда и разница в объёме: функций в разделе C больше, чем методов в разделе C++, но лишние — управление жизнью объектов и запрос ошибок, а не новые возможности.

Главная ловушка — не освободить объект после ошибки. Ошибка делает объект негодным, но память и соединение он держит, пока не вызван …Free: программа, которая просто бросает такие объекты, копит открытые соединения.
Что делает Хаб. Не используется: обвязками Хаб не пользуется.
Рекомендуемые значения

Три шага для соединения и письма:

Шаг Соединение Письмо
выделить PmtaConnAlloc PmtaMsgAlloc
инициализировать PmtaConnConnectRemote PmtaMsgInit
освободить PmtaConnFree PmtaMsgFree
Разделение выделения и инициализации, освобождение и закрытие соединения — из руководства (§ 7.5, § 7.5.1, § 7.5.6, § 7.5.9, § 7.5.29). Таблица — наша.
Пример в конфигурации
# соединение от выделения до освобождения
PmtaConn conn = PmtaConnAlloc();
if (!PmtaConnConnectRemote(conn, "127.0.0.1", 25)) puts(PmtaConnGetLastError(conn));PmtaConnFree(conn);
PmtaConnFree вызывают и при ошибке: он освобождает ресурсы и закрывает соединение.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
⇄

Связанные записи

0 связей

Как проверить на узле
Проверить, что объявления обвязки на месте:
grep -n 'PmtaConnFree' /opt/pmta/api/include/submitter/PmtaConn.h
Объявление функции в заголовке — обвязка установлена.
В Хабе
Цена ошибки
безопасно: неверное значение ничего не ломает