Hello,
I'm having several issues with the GC, and some ideas to try to solve it
that I need to clarify. I had a C# method that I stripped down in order to
reimplement it in C++, using the 'extern' keyword and the
[MethodImplAttribute(MethodImplOptions.InternalCall)]modifier, just as
several methods of some Rotor classes are already 'natively' implemented.
This method receives an object parameter, whose type is a normal C# class.
This class has a C++ counterpart that I use to manipulate its data in C++,
and I'm sure that the mapping from the C# class to the C++ one is
implemented and done correctly. In some point of the execution, I need to
'Clone' this parameter in order to store a separate copy of it, but the copy
is not an exact one, because I don't need (and I can't) to clone all the
object's attributes, so the situation is like this:
C# class:
Class C
{
string param1;
Object param2;
}
C++ class:
Class C
{
StringObject *param1;
Object *param2;
Public C Clone ();
}
Method implementation:
Method(C *classObj, ...)
{
....
//If some conditions are true, then I need to clone classObj
newObj = classObj->Clone();
//Store the copy (newObj) in a handle table in order to avoid it to be
GC-collected.
}
C's Clone method is implemented as follows:
C *C::Clone()
{
... //Create a new Object loading the type and so on.
//Copy the attributes
newObject->param1 = param1;
newObject->param2 = param2;
return newObject;
}
Although both objects are inserted in a handle table in order to avoid them
to be collected by the GC, during execution it seems that the copy that I
made loses his attribute values. So, the pointers seem to be not valid
anymore and I understand that the objects that are pointed to in that
location where moved. The question is: What do I need to do in order to
avoid this problem? Is there any way to safely do what I'm pretending to do
or do I need to use any other procedure? I also GCPROTECT both objects
during the operations.
Hope that I explained well the situation. Thank you very much for your help,
J. Redondo
===================================
This list is hosted by DevelopMentor� http://www.develop.com
View archives and manage your subscription(s) at http://discuss.develop.com