Прогресс 4GL, который вызывает функцию C - PullRequest
1 голос
/ 14 марта 2011

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

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

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

Мои вопросы:

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

и

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

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

Привет.

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

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

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

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

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

0 голосов
/ 14 марта 2011

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

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

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

...