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

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

С++

Все интерфейсные объекты хранятся в умных указателях (см. 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