Progress 4GL, который вызывает функцию C

Я работал с некоторой функцией языка C, которая будет вызываться из приложения Progress 4GL, и у меня возникли следующие сомнения:

Функция C использует malloc для динамического выделения массива символов, и идея состоит в том, что указатель, который выделяет эту память, будет возвращен процессу Progress 4GL, который первоначально отправил тип данных MEMPTR для хранения результата метода C.

По сути, MEMPTR из Progress должен быть отправлен в функцию C, чтобы «получить» сгенерированный C массив и использовать его, когда область видимости возвращается к нему из функции de C (проход по ссылке между обоими языками, где метод C «заполняет» прогресс MEMPTR Переменная).

Мои вопросы:

Когда процесс Progress завершается и переменная MEMPTR «освобождается», освобождает ли он также память, выделенную malloc в функции C?

и

Если я освобожу память, выделенную malloc, в функции C, я предполагаю, что процесс Progress получит данные мусора. Это правильно?

Спасибо за ваше время и помощь.

Привет.


person LEH    schedule 14.03.2011    source источник


Ответы (2)


4GL/ABL: как вызвать функцию WIN32 API: GetLongPathName

Progress 4GL не управляет этой памятью за вас. Вам нужно предоставить метод для освобождения/освобождения этой памяти.

Да, если вы когда-либо обращаетесь к памяти free(), доступ к ней становится неопределенным - это может привести к сбою, может дать вам мусорные данные, или ваша программа может продолжить пыхтеть без ошибок.

Отказ от ответственности: я работаю в Progress.

person Chris K    schedule 14.03.2011

Как правило, в любой среде межъязыкового программирования это Плохая идея иметь или ожидать, что один язык освободит память, выделенную другим. Язык, который выделяет ресурсы (например, память), должен иметь соответствующий вызов для их освобождения, когда клиент закончит с ними.

C, в частности, не имеет сборки мусора, поэтому любая память, выделенная им, должна быть освобождена вручную.

Есть одно исключение. На большинстве (невстроенных) платформ все выделенные ресурсы будут возвращены после завершения работы приложения. Таким образом, если выделение является одноразовым типом запуска (а не выполняется в цикле или что-то в этом роде), то, как правило, можно просто позволить ОС восстановить его при выходе из программы, а не беспокоиться о том, чтобы сделать это вручную.

person T.E.D.    schedule 14.03.2011