< Python/C++代码使用Cython有内存所有权问题。我不知道什么是解决这个问题的最好办法。所以我很感激你的帮助。在</p>
<p>我的策略如下:</p>
<ol>
<li>创建具有GET / SET成员的C++ NETFIN数据结构。在</li>
<li>用Python填充这个数据结构(从文件解析数据并完成SqLiteDB查找)。因此,我需要将NetInfo进行cythozing。在</li>
<LI>将NETFION对象传递给C++处理程序,以对它们进行操作。这些也将被cythonized。在</li>
</ol>
<p>对于NetInfo对象,我需要存储指向其他NetInfo对象的指针,以指示两个对象之间的交互。在</p>
<>我的(相关)C++代码如下:</P>
<pre><code>struct NetInfoData;
class NetInfo {
public:
NetInfo();
NetInfo(NetInfo const& rhs);
virtual ~NetInfo();
...
std::vector<NetInfo*> getBridgedNets() const;
void addBridgedNet(NetInfo const* ni);
protected:
NetInfoData* data_;
};
struct NetInfoData
{
std::string name;
...
std::vector<NetInfo*> bridged_nets; <-- NOTE: Storing pointers.
};
NetInfo::NetInfo()
: data_(0)
{
std::cout << "Constructor " << this << std::endl;
data_ = new NetInfoData();
}
NetInfo::~NetInfo()
{
std::cout << "Destructor " << this << std::endl;
delete data_;
}
NetInfo::NetInfo(NetInfo const& rhs)
: data_(0)
{
std::cout << "Copy constructor " << this << std::endl;
data_ = new NetInfoData();
data_->name = rhs.data_->name;
...
data_->bridged_nets = rhs.data_->bridged_nets;
}
std::vector<NetInfo*>
NetInfo::getBridgedNets() const
{
return data_->bridged_nets;
}
void
NetInfo::addBridgedNet(NetInfo* n)
{
data_->bridged_nets.push_back(n);
}
</code></pre>
<p>我的(相关)Cython代码如下。它编译/工作正常。在</p>
^{pr2}$
<p>现在我的Python伪代码如下:</p>
<pre><code>import PyNetInfo as NetInfo
a = NetInfo() # Create a
Update data members of a # Populate a
tmp = NetInfo(a) # Call copy constructor of a
for n in xrange(5): # a interacts with five other NetInfo objects so create and call them to a via add_bridged_net()
x = NetInfo(tmp) # Call copy constructor to make copy of tmp (not a!!)
Update data members of x
a.add_bridged_net(x) # Store pointer to x in a (a is updated!)
</code></pre>
<p>有问题的代码是<strong>x=NetInfo(tmp)</strong>。在第二次迭代中,分配给x的旧内存将被释放,因为x现在指向一个新对象。这将导致a现在包含无效指针。在</p>
<p>样本运行:</p>
<pre><code>create a
Constructor 0x101ecd0
create tmp
Copy constructor 0xd71d30
create bridge x
Copy constructor 0xd71bb0
add bridged net:
create bridge x
Copy constructor 0xc9f740
Destructor 0xd71bb0 <--- Destructor on old x is called due to reassignment which causes a to contain an invalid pointer (hence, eventually segfault)
add bridged net:
</code></pre>
<p>我不太清楚如何管理内存来解决这个问题。有人能帮忙吗?在</p>
<p>我在想也许使用共享指针?所以在我的C++代码中,我说</p>
<pre><code>typedef std::shared_ptr<NetInfo> NetInfoShPtr;
</code></pre>
<p>然后</p>
<pre><code>std::vector<NetInfo*> bridged_nets -> std::vector<NetInfoShPtr> bridged_nets;
</code></pre>
<p>但我不知道该怎么办。这个行吗?还是有其他的(更容易的?)怎么了?谢谢你的建议。在</p>