Advertisement

Error: Type is still used by function?

Started by September 30, 2013 04:55 PM
3 comments, last by WitchLord 11 years, 1 month ago

When engine is destructed, I got a error message saying "type string is still used by function erase". It seems that a the function is holding a reference to a type. It's true that the input parameter of function erase is string, but it never addref it.

What could be the problem?

The addref was most likely done implicitly by the engine.

Are you using funcdefs? Are any of these passed to the application, if so are you releasing the function object after you're done with it?

Can you reproduce the problem with a test app and share it with me? If you can I can debug it to find out where the missing Release() should be.

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

Advertisement

It is not easy to create a simple example, so I am trying to debug myself. I found it only happens on template object and the reason is that the template object is never released. No one calls ->Release() for the local variable so it is never deleted. I am not sure where it should be called, after function release or after context release? I am guessing that every function call is related to a context and when context releases all its local variable releases. According to the function name I think CleanStack is doing that but it is never called for successfully executed function. I am lost. Would you point me out the way where to look at?

Plus, I didn't use funcdefs, I just compile a script into a module and run one function of it. I only explicitly create one context for running function and get one function from the module. I am sure this two things are correctly released.

I found my bug! I tried to use inherited reference_count class and put AddRef and Release in the base class. Therefore the function address is for the base class and when call them with the address of the derived class as object using this_call, the function will consider it as the address of the base class and it cannot find the correct reference counter variable.

So I cannot register any function of the base class if the inheritance is not trivial.

That's good to know.

If you use inhereted reference_count then make sure to declare the AddRef and Release methods as virtual. And when registering these methods for the derived class make sure you take the address of the method as they appear in the derived class. Example:

class RefCount
{
public:
  virtual void AddRef();
  virtual void Release();
};
 
class Derived : public RefCount
{
public:
  static void Register(asIScriptEngine *engine)
  {
     engine->RegisterObjectType("Derived", 0, asOBJ_REF);
     engine->RegisterObectBehaviour("Derived", asBEHAVE_ADDREF, asMETHOD(Derived,AddRef), asCALL_THISCALL);
     engine->RegisterObjectBehaviour("Derived", asBEHAVE_RELEASE, asMETHOD(Derived,Release), asCALL_THISCALL);
  }
};
 

This will make sure that AngelScript use the correct object pointer when calling the class methods.

Regards,

Andreas

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

This topic is closed to new replies.

Advertisement