Перейти к основному содержимому
Версия: 3.8.0

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

С++

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

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

Example:

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

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