Страница 1 из 1

Параметры и результат в библиотеках .so

СообщениеДобавлено: 22.06.2012 20:55:06
dionic
Добрый день, народ.

Поискал тут на форуме инфу про использование библиотек под Unix системами и немного сам потестил некоторые возможности, но что-то никак не могу понять как правильно работать с библиотеками. Вопросы следующего плана:

1. Можно ли из библиотечной функции вернуть ну либо указатель на какой-либо объект или сам объект и чтобы не было утечек памяти.
2. Будут ли утечки памяти если возвращать PChar и не использовать модуль cmem.

По первому вопросу, я создавал объект TLIst в функции библиотеки и возвращал указатель на него в программу, после чего уничтожал его, однако уверенности в том, что память тоже освобождается у меня нет.

Re: Параметры и результат в библиотеках .so

СообщениеДобавлено: 23.06.2012 13:20:47
iskander
А сюда заглядывали?
http://www.gunsmoker.ru/2009/01/blog-post.html

Re: Параметры и результат в библиотеках .so

СообщениеДобавлено: 24.06.2012 11:07:38
dionic
Iskander, спасибо за ссылочку. Интересная статья, её не встречал, очень познавательная. Есть ещё вот такая http://freepascal.ru/article/freepascal/20050522025034. Из них можно много что подчеркнуть интересного. Однако там в основном, не знаю по каким причинам при приведении примеров в качестве параметров и возвращаемого результата используют строки ну или максимум динамические массивы. Данные конструкции освобождаются сами, ну то есть менеджером памяти при обнулении ссылок.

Что касается статьи gunsmoker, то там всё же написано про dephi. Так модуля sharedmem под Unix в Lazarus нету. Есть другой cmem. Однако его использование почему то у меня вызывает какие-то непонятные ошибки ещё на этапе компиляции.

Re: Параметры и результат в библиотеках .so

СообщениеДобавлено: 24.06.2012 13:54:40
iskander
dionic писал(а):Однако там в основном, не знаю по каким причинам при приведении примеров в качестве параметров и возвращаемого результата используют строки ну или максимум динамические массивы.

При отсутствии общего менеджера памяти с ними проблема.
dionic писал(а):Есть другой cmem. Однако его использование почему то у меня вызывает какие-то непонятные ошибки ещё на этапе компиляции.

В Windows полёт нормальный, cmem должен быть первым в uses и библиотеки, и приложения, использующего эту библиотеку.

Re: Параметры и результат в библиотеках .so

СообщениеДобавлено: 24.06.2012 17:53:48
dionic
Вообще не заметил проблемы при отсутствии общего менеджера памяти под Unix при возвращении из библиотечной функции PChar. Создал тестовый проект, в котором создаются потоки и вызывают библиотечную функцию, которая возвращает PChar длинной, ну например, 100000 символов, после чего поток умирает. Потоков создавалось достаточно много создавалось достаточно много 5000-10000 тысяч, но большого прироста использования памяти приложением, после уничтожения всех потоков я не наблюдал. Хотя замерял я это так сказать на глаз, по менеджеру процессов. Для чистоты эксперимента нужно, конечно, либо увеличить на порядок количество созданных потоков, ну или найти способ точно измерить используемую память приложением до и после жизни потоков. Под Unix я просто не знаю таких системных методов, которым можно сделать данные замеры.

А что касается Windows, то использование cmem меня там не интересует, я же всё твержу про Unix.

Re: Параметры и результат в библиотеках .so

СообщениеДобавлено: 24.06.2012 20:22:33
iskander
dionic писал(а):способ точно измерить используемую память приложением до и после жизни потоков.

Если будут утечки памяти, то в библиотеке, а не в приложении. Попробуйте использовать модуль heaptrc.
Что-нибудь вроде
Код: Выделить всё
library Mylib;
  ...
uses
  heaptrc,
  ...;

  ...
  ...
begin
  SetHeapTraceOutput('путь_к_логу_HeapTrace');
end.

Re: Параметры и результат в библиотеках .so

СообщениеДобавлено: 25.06.2012 08:10:24
dionic
iskander, спасибо за подсказку по модулю! Это то что нужно, теперь можно посмотреть какие есть утечки памяти.