On Sat, Mar 27, 2010 at 8:34 AM, yami <yamisoe@gmail.com> wrote:
What will happen if some_object is a data member of a 'new'ed C++ class instance? Another question, code likes following:
  for (i=0; i<n; i++) {
    cl_object object_from_ecl = si_safe_eval(...);
  }

if object_from_ecl is cached in C, how ECL knows when to gc this object?

It has no way to find it out by itself and it will normally assume the object is lost. This is in general not a good practice, because you are coupling things which are allocated by different beasts: C++'s memory manager or ECL's.

Solutions:

1) Allocate the classes using the Boehm-Weiser garbage collector. That implies using a newly defined "new" and "delete" operator pairs.

2) If there are only a few classes, register the location of the pointers with ECL using
  extern ECL_API void ecl_register_root(cl_object *p);

3) Even better, keep the objects in a lisp array and keep the array in a C++ global variable, and register this one using ecl_register_root(). Your classes can then keep pointers or indices into the array data.

4) Keep the objects in an array but store the array in a lisp global variable, with a given symbol. The symbol will not disappear if it is in a package so you can keep a pointer to the symbol

There are many more which may suit one or another problem better.

--
Instituto de Física Fundamental, CSIC
c/ Serrano, 113b, Madrid 28006 (Spain)
http://tream.dreamhosters.com