Это в основном вопрос о времени жизни временных. Если функция возвращает объект, но ссылка не назначена переменной и используется только для вызова метода в возвращенном объекте, автоматически очищается временная ссылка?
Чтобы привести конкретный пример, предположим, что есть цепочка вызовов методов:
o.method_a().method_b()
Является ли временная ссылка, возвращаемая o.method_a()
, автоматически очищенной, когда завершается вызов method_b()
, как если бы строка была записана как:
tmp = o.method_a()
try:
tmp.method_b()
finally:
tmp = None
РЕДАКТИРОВАТЬ: Меня интересует общий ответ. CPython завершает объекты, как только число ссылок падает до 0. Другие реализации Python могут не завершать объекты сразу. Мне интересно, похож ли язык Python на C ++, который гарантирует, что временные объекты уничтожаются в конце оператора, для которого они были созданы. (За исключением того, что в Python вопрос заключается в том, очищаются ли временные ссылки в конце оператора, для которого они были созданы.)
В C ++ подобный код может быть реализован с помощью:
class B {
public:
void method_b();
};
class A {
public:
std::shared_ptr<B> method_a();
};
A o;
o.method_a()->method_b();
Стандарт C ++ гласит: «Временные объекты уничтожаются как последний шаг в оценке полного выражения ... который (лексически) содержит точку, в которой они были созданы. Это верно, даже если эта оценка заканчивается созданием исключения. " В этом примере это означает, что временный объект std::shared_ptr<B>
, созданный при вызове A::method_a()
, уничтожается немедленно в конце вычисления полного выражения o.method_a()->method_b();
. Уничтожение std::shared_ptr
означает очистку ссылки на общий объект.