__DELETE

Der Operator ist eine Erweiterung der Norm IEC 61131-3.

Der Operator gibt den Speicher von Instanzen wieder frei, die der Operator __NEW dynamisch erzeugt hat. Der Operator __DELETE hat keinen Rückgabewert und der Operand wird nach dieser Operation auf 0 gesetzt.

Syntax: __DELETE (<Pointer>)

Wenn Pointer auf einen Funktionsbaustein zeigt, ruft TwinCAT die zugehörige Methode FB_exit auf, bevor der Pointer auf 0 gesetzt wird.

__DELETE 1:

Umgang mit dynamischem Speicher

Geben Sie immer den genauen Typen der Instanz an, dessen Speicher freigegeben werden soll.
Geben Sie bei Vererbung den abgeleiteten Funktionsbaustein an (Variable vom Typ POINTER TO FB_Sub) und nicht den Basis-Funktionsbaustein (Variable vom Typ POINTER TO FB_Base).
Wenn der Basis-Funktionsbaustein keine FB_exit-Funktion implementiert, dann wird bei der späteren Verwendung von __DELETE (pfbBase) kein FB_exit aufgerufen!

Beispiel:

Funktionsbaustein FB_Dynamic:

FUNCTION_BLOCK FB_Dynamic 
VAR_INPUT 
    nIn1, nIn2 : INT; 
END_VAR 
VAR_OUTPUT 
    nOut : INT; 
END_VAR 
VAR
    nTest1 : INT := 1234; 
    _inc   : INT := 0; 
    _dut   : POINTER TO DUT; 
    bNeu   : BOOL; 
END_VAR
nOut := nIn1 + nIn2;

Methode FB_exit:

METHOD FB_exit : BOOL 
VAR_INPUT 
    bInCopyCode : BOOL; 
END_VAR 
__DELETE(_dut); 

Methode FB_init:

METHOD FB_init : BOOL 
VAR_INPUT 
    bInitRetains : BOOL; 
    bInCopyCode  : BOOL; 
END_VAR
_dut := __NEW(DUT); 

Methode INC:

METHOD INC : INT 
VAR_INPUT 
END_VAR 
_inc := _inc + 1; 
INC  := _inc; 

Programm MAIN:

PROGRAM MAIN 
VAR 
    pFB     : POINTER TO FB_Dynamic; 
    bInit   : BOOL := TRUE; 
    bDelete : BOOL; 
    nLoc    : INT; 
END_VAR
IF (bInit) THEN 
    pFB := __NEW(FB_Dynamic);
    bInit := FALSE; 
END_IF

IF (pFB <> 0) THEN
    pFB^(nIn1 := 1, nIn2 := nLoc, nOut => nLoc); 
    pFB^.INC(); 
END_IF 

IF (bDelete) THEN 
    __DELETE(pFB); 
END_IF