Steel
Software Engineer
- Reaction score
- 109
neither..destroy() only nullifies the data within the struct, it doesn't actually delete/remove/destroy/kill anything, correct?
struct MyStruct
group g = CreateGroup()
endstruct
//Generated destructor of MyStruct
function s__MyStruct_destroy takes integer this returns nothing
if this==null then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Attempt to destroy a null struct of type: MyStruct")
return
elseif (si__MyStruct_V[this]!=-1) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Double free of type: MyStruct")
return
endif
set si__MyStruct_V[this]=si__MyStruct_F
set si__MyStruct_F=this
endfunction
struct Point
location spellLoc
endstruct
function SaveLoc takes nothing returns nothing
local Point data = Point.create()
set data.spellLoc = GetSpellTargetLoc()
// Next line only releases struct id for overwriting by new
// Point.create() calls. but dosn' t clean its content.
call data.destroy()
// Currently new given struct still points to our old struct
// target point of ability being cast location.
set data = Point.create()
call BJDebugMsg("Newly created struct spellLoc X is " +R2S(GetLocationX(data.spellLoc)) + " and Y is " + R2S(GetLocationY(data.spellLoc)))
// We now create memory leak because we don' t remove old location
// instead we replace it with new one and erase reference to old
// location where it previously was referring to.
set data.spellLoc = Location(0.,0.)
// We now don' t have any way to remove old location whatsoever.
// end of exaple how you create memory leaks.
endfunction
struct Point
location spellLoc
method onDestroy takes nothing returns nothing
// we refer to currently being destroyed struct with
// . (dot) syntax.
// Also would work 'this.spellLoc' (without '').
call RemoveLocation(.spellLoc)
endmethod
endstruct
function SaveLoc takes nothing returns nothing
local Point data = Point.create()
set data.spellLoc = GetSpellTargetLoc()
// struct content will be cleaned.
call data.destroy()
set data = Point.create()
// Not going to call BJDebugMsg() because there isn' t any location
// anymore stored in newly given struct.
// Nothing goes missing because our onDestroy() method took care
// of our old struct location.
set data.spellLoc = Location(0.,0.)
// end of exaple how you avoid memory leaks.
endfunction
Not necessarily.>global arrays
global integer arrays.
>Not necessarily.
What do you mean?