В обвязке C создание объекта разбито на два вызова — выделение и инициализацию, — чтобы отличать нехватку памяти от прочих ошибок: …Alloc возвращает нулевой указатель, если памяти нет, а инициализация — PmtaConnConnectRemote, PmtaMsgInit, PmtaRcptInit — сообщает об остальном.
По окончании объект освобождают функцией …Free; освобождение соединения заодно закрывает его. Получателя освобождают всегда — и после добавления в письмо, иначе память утекает.
Отсюда и разница в объёме: функций в разделе C больше, чем методов в разделе C++, но лишние — управление жизнью объектов и запрос ошибок, а не новые возможности.
Три шага для соединения и письма:
| Шаг | Соединение | Письмо |
|---|---|---|
| выделить | PmtaConnAlloc | PmtaMsgAlloc |
| инициализировать | PmtaConnConnectRemote | PmtaMsgInit |
| освободить | PmtaConnFree | PmtaMsgFree |
# соединение от выделения до освобождения PmtaConn conn = PmtaConnAlloc(); if (!PmtaConnConnectRemote(conn, "127.0.0.1", 25)) puts(PmtaConnGetLastError(conn));PmtaConnFree(conn);
0 связей
grep -n 'PmtaConnFree' /opt/pmta/api/include/submitter/PmtaConn.h