Обеспечить порядок уничтожения - PullRequest
2 голосов
/ 08 апреля 2019

У меня есть два класса C ++, которые, например, предполагают, что

class A
{
};

class B
{
};

Затем я обертываю их SWIG для создания привязок Python

%include "A.h"
%include "B.h"
...etc

На стороне Python я использую их как

a = A()
b = B()

Я хотел бы каким-то образом обеспечить, чтобы порядок уничтожения был ~B(), а затем ~A(). Если они вызываются в другом порядке, ~B() будет зависать из-за висячих указателей.

Можно ли как-то изменить интерфейс SWIG, чтобы сначала принудительно уничтожить B? Как только разрешить его использование в диспетчере контекста? Добавить ссылку на объект A? Возьмите аргумент A в конструкторе B и добавьте инкремент к его счетчику ссылок?

1 Ответ

3 голосов
/ 08 апреля 2019

Во-первых, Python не гарантирует порядок уничтожения. Если вам нужно что-то вроде RAII в C ++, используйте для этого контекстный менеджер.

Во-вторых, если ваш код C ++ не работает, то это ошибка вашего кода C ++. В общем, вы должны стремиться к коду, который даже не компилируется, если не используется должным образом. Здесь я бы предложил вам передать shared_ptr<A> в B, чтобы убедиться, что A не уничтожен до B.

...