【问题标题】:Enforce destruction order执行销毁令
【发布时间】:2019-04-08 19:50:07
【问题描述】:

我有两个 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 对象的引用?在B 的构造函数中取一个A 参数并增加其引用计数?

【问题讨论】:

  • 如果您的类设计要求以特定顺序销毁对象,那么您的类设计是错误的。
  • 如果您创建一个没有AB 或一个没有BA 会发生什么?你应该设计你的类,这样这样的事情就不会发生。
  • 我不确定 Ulrich 所说的上下文管理器是什么意思,所以这可能是同一个想法。创建一个新类 AB,让 AB 处理 C++ 代码中 A 和 B 的创建和销毁。只将 AB 传递给 Python。
  • @john 这可能是对或错,但一般来说可能是无用的建议。
  • @ZanLynx:术语“上下文管理器”是一个 Python 术语。基本上,它保证一段代码由两个操作构成,一个在进入,一个在退出,非常类似于例如使用 RAII 的 scoped_lock

标签: python c++ swig


【解决方案1】:

首先,Python 不保证销毁顺序。如果您需要 C++ 的 RAII 之类的东西,请使用上下文管理器。

其次,如果您的 C++ 代码出现段错误,那是您的 C++ 代码的错误。通常,您应该针对如果使用不当甚至无法编译的代码。在这里,我建议您将shared_ptr<A> 传递给B,以确保AB 之前不会被破坏。

【讨论】:

  • 我想试试你的第二个建议,但我想我坚持细节。我可以将std::shared_ptr<A> 添加到B 的构造函数中,但是在上面的Python 代码中,当我说a = A() 时,如果我将该对象作为b = B(a) 传递给下一个对象,那么Python 怎么知道ashared_ptr 并且不删除它,因为b 现在也拥有它的部分所有权?
  • 你可以把它留给 Python,这将确保只要对象仍然在某处被引用,它们就会保持活动状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2015-04-26
  • 2017-09-06
相关资源
最近更新 更多