Jump to content
  • Advertisement
Sign in to follow this  
zexee

Error: Type is still used by function?

This topic is 2112 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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?

Share this post


Link to post
Share on other sites
Advertisement

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.

Share this post


Link to post
Share on other sites

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.

Edited by zexee

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!