Перейти к основному содержимому
Версия: 3.30 (последняя)

Управление памятью

С++​

Все интерфейсные объекты хранятся в умных указателях (см. pbio::LightSmartPtr и pbio::HeavySmartPtr). Для удобства каждый интерфейсный объект T объявляет собственный тип указателя T::Ptr (например, pbio::Template::Ptr), поэтому не используйте pbio::LightSmartPtr или pbio::HeavySmartPtr напрямую. Большинство объектов используют pbio::LightSmartPtr, который в целях значительного снижения потребления памяти не позволяет хранить наследованные типы или использовать особый deleter.

Если вы используете OpenCV / boost / C++11, то можете определить один из перечисленных ниже макросов, чтобы настроить libfacerec на использование определенного типа указателей вместо pbio::HeavySmartPtr:

  • PBIO_OPENCV_SMART_POINTER – для использования cv::Ptr,
  • PBIO_BOOST_SMART_POINTER – для использования boost::shared_ptr,
  • PBIO_CXX11_SMART_POINTER – для использования std::shared_ptr.

Если ни один из этих макросов не определен, будет использован указатель, определенный в pbio/shared_ptr/heavy_shared_ptr.h - усеченная версия умного указателя из OpenCV, не требующая использования OpenCV.

Во всех случаях T::Ptr является потокобезопасным умным указателем.

Библиотека libfacerec автоматически выгрузится, когда не останется интерфейсных объектов.

Java​

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

Пример:

...
Capturer capturer = service.createCapturer(service.new Config("common_capturer.xml"));
...
capturer.dispose(); // release internal objects
if (capturer.isDisposed())
{
System.out.println("object is disposed");
}
capturer.capture(image); // exception, object is disposed
// this line never be reached

C#​

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

Пример:

...
Capturer capturer = service.createCapturer("common_capturer.xml");
...
capturer.Dispose(); // release internal objects
if (capturer.IsDisposed)
{
Console.WriteLine("object is disposed");
}
capturer.capture(image); // exception, object is disposed
// this line never be reached

Python​

Для освобождения памяти от внутренних объектов используются деструкторы. Сборщик мусора автоматически освобождает память, когда это необходимо.

Пример:

...
capturer = service.create_capturer("common_capturer.xml")
...
del capturer # release internal objects

capturer.capture(image) # exception, object is disposed
# this line never be reached