Bernd, since PB does not clear AllocateMemory() in Procedures, the memory lives on!
If you are not using the return value directly in an expression, pass the Structure in the parameters list so you don't have to worry about memory leaks.
Code:
Structure TVec3
X.f
Y.f
Z.f
EndStructure
; Safer code and no Global or memory leak.
Procedure.i StringtoVec3_1(text.s, *t.TVec3, scale.f = 1.0)
*t\X = ValF(StringField(text, 1, ",")) * scale ; No need for If len(text)!
EndProcedure
Define myV.TVec3
Debug StrF(myV\X)
StringtoVec3_1("5.4,3.2,1.0", @myV, 2.0)
Debug StrF(myV\X)
; Requires Memory Management or possible global variable
Procedure.i StringtoVec3_2(text.s, scale.f = 1.0)
Protected *t.TVec3 = AllocateMemory(SizeOf(TVec3))
*t\X = ValF(StringField(text, 1, ",")) * scale ; No need for If len(text)!
Debug "memaddr = " + Str(*t)
ProcedureReturn *t ; this memory is not cleared so it lives on!
EndProcedure
Define *myV.TVec3 = AllocateMemory(SizeOf(TVec3))
Debug "memaddr = " + Str(*myV)
Debug StrF(*myV\X)
*myV = StringtoVec3_2("5.4,3.2,1.0")
Debug StrF(*myV\X)