2011-02-01 18 views
3

私は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 
  1. 変数el_sとel_hゴミが収集されたとき?
  2. el_sおよび/またはel_hのキーワード 'local'を使用して、 'for'ループの各繰り返しの最後に変数が破棄されるようにする必要がありますか?
  3. インデックスはC/C++の世界では0から始まりますが、Lua側からは1つです。これは自分のコードで認識する必要がありますか?またはtolua ++グルーコードでこれを管理しますか?

注:私は意図的だ、(ブーストのように:shared_ptrの)スマートポインタを使用していないCライブラリは/解除などのメモリ割り当てのすべてを処理するため、と私はLuaのガベージコレクタがで蹴る時に知らないことから、私がLua(tolua ++を介して)に公開するすべてのラッパークラスは、プライベートメンバーとして生のCスタイルのポインタを含みます。公開されたC++クラスがLua GCによって収穫されると、それらは削除されません。この方法では、Cライブラリはmemを必要に応じて、それ自身で削除します。ポインタをぶら下げる危険はありません。共有ポインタやその他のスマートポインタを参照カウントで使用すると、混乱するかもしれませんLua GCの活動(あなたが要点を得ることを望みます - この最後のビットはあまり明確ではありませんが)。結論として、私は正当な理由で生のptrsを使用しています。

答えて

0

ルアでは、もはや参照されていない要素は、適切なタイミングでガベージコレクションされます。 これは、上書きするたびにel_hel_sがガベージコレクションの対象とみなされることを意味します。localを作成する必要はありません。言い換えれば

i = 1を使用すると、オブジェクトはあなたがi = 2

私は仮定のために取得しますel_hに割り当てる際にゴミが収集されているためにマークされたときにel_hのために取得しますオブジェクトtolua ++はメタテーブルを扱いますので、オブジェクトがガベージコレクトされるたびにデストラクタが呼び出されますので、CやC++の関数のバインドコードを手で書く方が簡単なので、これを使ったことはありません。

しかし、もしtolua ++があなたのためにインデックスをスケールするなら、それはそれを行うべきであるという手がかりはありません。 C++で行うのと同じ引数をLuaのwrapper.getElementAtIndexStackAllocated()に渡す必要があります。

「ガベージコレクションのマークが付いている」ということに注意してください。ガベージコレクションが実際に行われる時期は、さまざまな要因によって異なります。一般的に、これに依存することはお勧めできません。ただし、ガベージコレクションを強制することができますcollectgarbage("collect")

関連する問題