after almost giving up I sent an email to Barry who developed OpenOPC.
He had a look at my code and here is his answer:
After implementing his suggestions everything works the way it should, no more memory leak.Robert,
I just looked briefly at your code and noticed that you are not using a named OPC group when calling the opc.read() function.
Some users have experienced a slow memory leak when repeatedly calling opc.read() without specifying an explicit group name. When no group name is specified, the function will automatically create an OPC group and then destroy it before the function exists.
But by using a named OPC group which you re-use each time, you will avoid the repeated creation/destruction cycle and the memory leak should disappear.
The first time through any loop do your read call like this....
Then all subsequent times call read like this....
The OPC group will be reused each time, re-fetching the values for the same tag list.
Big thanks to Krambriw for trying to help me.