<p>当Python创建您的<code>Config</code>对象时,它不保存对它的永久引用。您的配置容器类只包含一个简单的指针,所以即使在C++中,如果不保持对象活着,配置容器也不会知道。在</p>
<p>下面的代码行使用Python创建一个临时的<code>Config</code>对象,该对象在该行完成时被销毁:</p>
<pre><code>c = ConfigContainer(Config())
</code></pre>
<p>如果向构造函数和析构函数添加封装外形,可以看到这一点,就像我下面所做的那样:</p>
^{pr2}$
<p>所以现在ConfigContainer持有一个被破坏的指针。简单的解决方案是在完成之前保留对<code>Config</code>的引用。在</p>
<pre><code>>>> import x
>>> c = x.Config()
__cdecl Config::Config(void)
>>> cc = x.ConfigContainer(c)
__cdecl ConfigContainer::ConfigContainer(class Config *)
</code></pre>
<p>复杂的解决方案是实现引用计数(参见<a href="http://www.swig.org/Doc2.0/SWIGDocumentation.html#SWIGPlus_ref_unref" rel="nofollow">6.25 C++ reference counted objects - ref/unref feature</a>)。在</p>
<p>另一个解决方案是通过更改容器来使用SWIG对<code>std::shared_ptr</code>的支持:</p>
<pre><code>class ConfigContainer
{
std::shared_ptr<Config> config;
public:
ConfigContainer(std::shared_ptr<Config>&);
~ConfigContainer();
void showDebug(void);
};
</code></pre>
<p>以下文件是必需的接口:</p>
<pre><code>%include <std_shared_ptr.i>
%shared_ptr(Config) // This instantiates the template for SWIG
</code></pre>
<p>现在,<code>Config</code>将被引用计数:</p>
<pre><code>>>> import x
>>> cc = x.ConfigContainer(x.Config())
__cdecl Config::Config(void)
__cdecl ConfigContainer::ConfigContainer(class std::shared_ptr<class Config> &)
</code></pre>
<p><code>ConfigContainer</code>现在包含对<code>Config</code>的引用。销毁容器会销毁对<code>Config</code>的最后一个引用:</p>
<pre><code>>>> del cc
__cdecl ConfigContainer::~ConfigContainer(void)
__cdecl Config::~Config(void)
</code></pre>
<p>但是如果Python有它自己的引用,那么当Python处理完它时,只会销毁容器:</p>
<pre><code>>>> c = x.Config()
__cdecl Config::Config(void)
>>> cc = x.ConfigContainer(c)
__cdecl ConfigContainer::ConfigContainer(class std::shared_ptr<class Config> &)
>>> del cc
__cdecl ConfigContainer::~ConfigContainer(void)
>>> del c
__cdecl Config::~Config(void)
</code></pre>