Локальные переменные уничтожаются в порядке, обратном созданию.В вашем случае у вас все в порядке, поскольку owner
всегда будет уничтожено до owned
.
§6.6 [stmt.jump] p2
При выходе из области действия (как выполнено),объекты с автоматическим сроком хранения (3.7.3), построенные в этой области, уничтожаются в порядке, обратном их построению.
Однако следует соблюдать осторожность, если вы можете переназначить принадлежащего участникапосле строительства.
как вы можете создать ситуацию, когда два экземпляра ссылаются друг на друга?
Не позволяйте им обращаться друг к другу в своем деструкторе.Или проясните, кто именно будет уничтожен первым, может быть, с помощью обратного вызова или пропущенного флага.Пример:
struct two;
struct one{
two* other;
one(two* o = nullptr) : other(o) {}
~one(){ if(other) other.other = nullptr; }
};
struct two{
one* other;
two(one* o = nullptr) : other(o) {}
~one(){ if(other) other.other = nullptr; }
};
Это гарантирует, что оба объекта никогда не ссылаются на несуществующий.
В любом случае взаимно ссылающиеся объекты очень редки.