私はLuaをC++プロジェクトに埋め込むことに取り組んでいます。これは、従来のCコードに大きく依存しています。ガベージコレクションと可変スコープに関するいくつかの質問があります。ここでC言語でのLuaの埋め込みCとの混同
が続く質問に関連するいくつかのスニペットです:
/* 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 ++グルーコードでこれを管理しますか?
注:私は意図的だ、(ブーストのように:shared_ptrの)スマートポインタを使用していないCライブラリは/解除などのメモリ割り当てのすべてを処理するため、と私はLuaのガベージコレクタがで蹴る時に知らないことから、私がLua(tolua ++を介して)に公開するすべてのラッパークラスは、プライベートメンバーとして生のCスタイルのポインタを含みます。公開されたC++クラスがLua GCによって収穫されると、それらは削除されません。この方法では、Cライブラリはmemを必要に応じて、それ自身で削除します。ポインタをぶら下げる危険はありません。共有ポインタやその他のスマートポインタを参照カウントで使用すると、混乱するかもしれませんLua GCの活動(あなたが要点を得ることを望みます - この最後のビットはあまり明確ではありませんが)。結論として、私は正当な理由で生のptrsを使用しています。