Original Post
AngelScript 2.8.0a is crashing after it leaves the destructor of my C++ class ScriptObject. I don't know why. Base class: Base class registration: Derived class: Derived class code: Derived class registration: Script: Behavior: ScriptVector3_ConstructFloat3 is called ok and the values are as in script. Immediately after, because the Vector3 leaves the scope of the function, it calls ScriptObject::ScriptReleaseRef The destructor is called,scriptContext is released. All the addresses are correct. After it leaves the Destructor, it crashes with the message: Windows has triggered a breakpoint in GalacticMelee.exe This may be due to a corruption of the heap, and indicates a bug in GalacticMelee.exe or any of the DLLs it has loaded I'm linking with a debug DLL with debug info. Here's the relevant callstack: [Edited by - Rakkar2 on April 3, 2007 10:53:35 PM]
ScriptObject::ScriptObject()
{
scriptRefCount=1;
scriptContext = ScriptManager::engine->CreateContext();
}
ScriptObject::~ScriptObject()
{
if (scriptContext)
scriptContext->Release();
}
void ScriptObject::ScriptAddRef(void)
{
++scriptRefCount;
}
void ScriptObject::ScriptReleaseRef(void)
{
if (--scriptRefCount<=0)
{
delete this;
}
}
ScriptManager::engine->RegisterObjectType(className, classSize, supportedOps);
ScriptManager::engine->RegisterObjectBehaviour(className, asBEHAVE_ADDREF, "void f()", asMETHOD(ScriptObject, ScriptAddRef),asCALL_THISCALL);
ScriptManager::engine->RegisterObjectBehaviour(className, asBEHAVE_RELEASE, "void f()", asMETHOD(ScriptObject, ScriptReleaseRef),asCALL_THISCALL);
#include "OgreVector3.h"
#include "ScriptObject.h"
class ScriptVector3 : public Ogre::Vector3, public ScriptObject
{
public:
static void RegisterScriptClass(void);
};
void ScriptVector3_Construct(ScriptVector3 *o)
{
new(o) ScriptVector3();
}
void ScriptVector3_ConstructFloat3(const float _x, const float _y, const float _z, ScriptVector3 *o)
{
ScriptVector3 *obj = new(o) ScriptVector3();
obj->x=_x;
obj->y=_y;
obj->z=_z;
}
void ScriptVector3_Destruct(ScriptVector3 *o)
{
o->~ScriptVector3();
}
ScriptObject::RegisterScriptClass("Vector3", sizeof(Vector3), asOBJ_CLASS_CA);
ScriptManager::engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ScriptVector3_Construct), asCALL_CDECL_OBJLAST);
ScriptManager::engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", asFUNCTIONPR(ScriptVector3_ConstructFloat3, (const float, const float, const float), void), asCALL_CDECL_OBJLAST);
void ModuleUpdate(GMScript &this, uint curTimeMS, uint elapsedTimeMS)
{
Vector3 vec(1,2,3.5);
}
GalacticMelee.exe!ScriptObject::~ScriptObject() Line 16 + 0x10 bytes C++
GalacticMelee.exe!ScriptVector3::`scalar deleting destructor'() + 0x3c bytes C++
GalacticMelee.exe!ScriptObject::ScriptReleaseRef() Line 25 + 0x34 bytes C++
angelscriptDebug.dll!asCScriptEngine::CallObjectMethod(void * obj=0x10d9eac0, asSSystemFunctionInterface * i=0x0b43e340, asCScriptFunction * s=0x0b43e3b0) Line 2487 + 0x8 bytes C++
angelscriptDebug.dll!asCScriptEngine::CallObjectMethod(void * obj=0x10d9eac0, int func=57) Line 2460 C++
angelscriptDebug.dll!asCContext::ExecuteNext() Line 1909 C++
angelscriptDebug.dll!asCContext::Execute() Line 918 + 0x8 bytes C++
> GalacticMelee.exe!ScriptObject::ExecuteContext() Line 31 + 0x17 bytes C++