![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Chapter 8. TopicsBoost , Boost.Python Reference Manual , Boost.Python Reference Manual
|
Тип аргумента |
поведение |
---|---|
< |
Аргумент Python создается теми же средствами, которые используются для возвращаемого значения обернутой функции C++, возвращающей T. Когда T является типом класса, это обычно означает, что x копируется в новый объект Python. |
Т* |
Если x == 0, то аргумент Python не будет ничьим. В противном случае аргумент Python создается теми же средствами, которые используются для возвращаемого значения обернутой функции C++, возвращающей T. Когда T является типом класса, это обычно означает, что x копируется в новый объект Python. |
boost::reference_wrapper |
Аргумент Python содержит указатель, а не копию x.get(). Примечание: неспособность гарантировать, что ни один код Python не содержит ссылки на полученный объект после срока службы *x.get() может привести к сбою! |
pointer_wrapper |
Если x.get() == 0, аргументом Python будет No. В противном случае аргумент Python содержит указатель, а не копию *x.get(). Примечание: неспособность гарантировать, что ни один код Python не содержит ссылки на полученный объект после срока службы *x.get() может привести к сбою! |
В целом<call<ResultType>()
>и call_method
В общем, чтобы получить аргументы Python, соответствующие a1...aN, для каждого должен быть создан новый объект Python; должен ли объект C++ быть скопирован в этот объект Python или объект Python просто должен содержать ссылку / указатель на объект C++? В общем, последний подход небезопасен, так как называемая функция может где-то хранить ссылку на объект Python. Если объект Python будет использоваться после уничтожения объекта C++, мы разрушим Python.
В соответствии с философией, согласно которой пользователям на стороне Python не нужно беспокоиться о сбое интерпретатора, поведение по умолчанию заключается в копировании объекта C++ и разрешении некопирующего поведения только в том случае, если пользователь пишет boost::ref(a1) вместо a1 напрямую. По крайней мере, таким образом, пользователь не получает опасное поведение «случайно». Также стоит отметить, что поведение без копирования («посредством ссылки») в целом доступно только для типов классов и не будет работать во время выполнения с исключением Python, если используется иначе.
Тем не менее, типы указателей представляют проблему: один из подходов заключается в отказе от компиляции, если какой-либо AN имеет тип указателя: в конце концов, пользователь всегда может пройти * AN, чтобы пройти «по значению» или ref (* AN), чтобы указать на поведение ссылки. Тем не менее, это создает проблему для ожидаемого нулевого указателя на преобразование «Никто»: незаконно отменять значение нулевого указателя.
Компромисс, на котором я остановился, таков:
Что касается результатов, у нас есть аналогичная проблема: если ResultType разрешено быть указателем или эталонным типом, срок службы объекта, на который он ссылается, вероятно, управляется объектом Python. Когда этот объект Python разрушается, наш указатель свисает. Проблема особенно плоха, когда ResultType является char const* - соответствующий объект Python String обычно однозначно упоминается, что означает, что указатель свисает, как только Call
Старый буст. Python v1 решает эту проблему, отказываясь компилировать любое использование call
В Росте. Python этим занимается:
char
const*
>возврат обратного вызоваcall<U>(...)
>, когда<U
>является указателем или эталонным типом.Это должно быть приемлемо безопасным, потому что пользователи должны четко указать указатель / ссылку для<U
>в<call<U>
>, и они будут защищены от болтовни во время выполнения, по крайней мере, достаточно долго, чтобы выйти из вызова<call<U>(...)
>.
Статья Chapter 8. Topics раздела Boost.Python Reference Manual Boost.Python Reference Manual может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Boost.Python Reference Manual ::
реклама |