【发布时间】:2011-02-01 08:52:32
【问题描述】:
我正在将 Lua 嵌入到 C++ 项目中,该项目严重依赖于一些遗留 C 代码。我有一些关于垃圾收集和变量范围的问题。
这里有一些与以下问题相关的sn-ps:
/* C side */
typedef struct
{
/* fields */
} Element;
typedef struct
{
void * m_elems
unsigned int size;
} Container;
// C API for managing Container and Element
....
int allocContainer(Container*, unsigned int);
void freeContainer(Container*);
Element * getElemByIndex(unsigned int);
// C++ side
struct ElementWrapper
{
private:
Element m_elem;
public:
/* field accessors (NO modifiers) */
};
class ContainerWrapper
{
private:
ContainerWrapper m_cntnr;
public:
ContainerWrapper(int N); // allocates space for N elements
~ContainerWrapper();
// stack alloc'ed variable
ElementWrapper getElementAtIndexStackAllocated(unsigned idx) const;
// heap alloc'ed variable
ElementWrapper * getElementAtIndexHeapAllocated(unsigned idx) const;
};
-- Lua side
wrapper = Container:new(10)
for i =1,10 do
-- get the ith element
el_s = wrapper.getElementAtIndexStackAllocated(i)
el_h = wrapper.getElementAtIndexHeapAllocated(i)
-- do something with retrieved element ..
end
- 变量 el_s 和 el_h 何时进行垃圾回收?
- 我是否需要对 el_s 和/或 el_h 使用“local”关键字来确保在“for”循环中的每次迭代结束时丢弃变量?
- C/C++ 世界中的索引从 0 开始,但 Lua 方面的索引从 1 开始 - 我需要在我的代码中注意这一点,还是 tolua++ 胶水代码为我管理这个?
注意:我故意不使用智能指针(如 boost:shared_ptr),因为 C 库处理所有内存分配/释放等,而且由于我不知道 Lua 垃圾收集器何时启动,所有我向 Lua 公开的包装类(通过 tolua++)包含原始 C 样式指针作为私有成员。当 Lua GC 收集暴露的 C++ 类时,它们不会被删除。这样,C 库将在需要时自行删除 mem - 并且没有悬空指针的危险 - 如果我使用共享指针或其他带有引用计数的智能指针可能会出现这种情况Lua GC 活动(希望你明白要点——尽管我知道最后一点不是很清楚)。归根结底,我使用原始 ptrs 是有充分理由的。
【问题讨论】: