if I have an array of udt ptr constructed with NEW. Will the ERASE or REDIM call the DELETE for us?
Code: Select all
redim as udt ptr array(1)
array(1) = new udt
erase array ' content deleted or memory leak? -> leak confirmed
Thanks
Code: Select all
redim as udt ptr array(1)
array(1) = new udt
erase array ' content deleted or memory leak? -> leak confirmed
Ok.fxm wrote:No
The general rule is:
If you call New, you must call Delete as many times.
Code: Select all
redim as udt ptr array(1)
array(1) =@(udt())
erase array ' content deleted or memory leak?
Code: Select all
type udt
dim as integer a
declare constructor
declare destructor
end type
constructor udt
print "constructing"
end constructor
destructor udt
print "destructing"
end destructor
? 1
redim as udt ptr array(1)
? 2
array(1) =@(udt())
? 3
erase array ' content deleted or memory leak?
? 4
redim as udt ptr array(1)
? 5
array(1) = new udt
? 6
erase array ' content deleted or memory leak?
? 7
badidea wrote:I think that both are not good:
Yes?fxm wrote:Yes, both are bad.
Code: Select all
dim as UDT u1
array(1) = @ u1
erase array '.. u1 is still leaving its life
Code: Select all
type udt
dim as integer a
declare constructor
declare destructor
end type
constructor udt
print "constructor udt"
end constructor
destructor udt
print "destructor udt"
end destructor
'----------------------------------------------------
type array_udt
dim as udt ptr pArray(any)
declare constructor
declare destructor
declare sub createSomeItems(nItems as integer)
declare sub eraseAndDelete()
end type
constructor array_udt
print "constructor array_udt"
end constructor
destructor array_udt
print "destructor array_udt"
eraseAndDelete()
end destructor
sub array_udt.createSomeItems(nItems as integer)
redim as udt ptr pArray(nItems-1)
for i as integer = 0 to ubound(pArray)
pArray(i) = new udt
next
end sub
sub array_udt.eraseAndDelete()
for i as integer = 0 to ubound(pArray)
pArray(i)->destructor
pArray(i) = 0
next
erase pArray
end sub
'----------------------------------------------------
dim as array_udt stuff
stuff.createSomeItems(3)
print "do things"
Thanks, that's indeed very longer than expected.badidea wrote: This kind of code always gets longer then planned.
Code: Select all
sub array_udt.eraseAndDelete()
for i as integer = 0 to ubound(pArray)
pArray(i)->destructor
pArray(i) = 0
next
erase pArray
end sub
Code: Select all
sub array_udt.eraseAndDelete()
for i as integer = 0 to ubound(pArray)
'pArray(i)->destructor '' udt instance is destructed but corresponding allocated memory is not freed
delete pArray(i) '' udt instance is destructed then corresponding allocated memory is freed
'pArray(i) = 0 '' useless because the array is then erased
next
erase pArray
end sub