Как вы называете деструктор или когда он автоматически вызывается из python в pybind11? - PullRequest
0 голосов
/ 13 января 2019

Если я использую политику take_ownership возвращаемых значений в pybind11 и вызываю функцию, которая возвращает, скажем, std::vector<Dog>, как я могу гарантировать, что деструкторы вектора и его содержимого вызываются? Это как-то связано с выходом за рамки клиентского кода python?

1 Ответ

0 голосов
/ 08 марта 2019

Все будет уничтожено, когда Python-мусор соберет объект (и вызовет хуки API CPython).

См. Здесь документы Python:

https://docs.python.org/3.7/reference/datamodel.html#objects-values-and-types https://docs.python.org/3.7/reference/datamodel.html#object.del

Объекты никогда не уничтожаются явно; однако, когда они становятся недоступными, они могут быть собраны мусором. [...]

Специально для pybind, вот биты выделения, которые вызываются при удалении:

  1. https://github.com/pybind/pybind11/blob/25abf7e/include/pybind11/detail/class.h#L389
  2. https://github.com/pybind/pybind11/blob/25abf7e/include/pybind11/detail/class.h#L346
  3. https://github.com/pybind/pybind11/blob/25abf7e/include/pybind11/detail/class.h#L327
  4. https://github.com/pybind/pybind11/blob/25abf7e/include/pybind11/pybind11.h#L1339
...