Thanks for your quick response. > The table, once it is no longer referenced by anything, will destroy itself > and call the destructors for all the elements in it.
Unfortunately the example below disagrees: import tables type AObj = object name: string proc `=destroy`(x: AObj) = echo "Destroying A named ", x.name `=destroy`(x.name) type BObj = object name: string tableField: Table[string, AObj] proc `=destroy`(x: BObj) = echo "Destroying B named ", x.name `=destroy`(x.name) proc newBObj(name: string): ref BObj = result = BObj.new() result.name = name result.tableField["A#1"] = AObj(name: "A#1") echo "Creating B#1" var bobj1 = newBObj("B#1") echo "Setting B#1 to NIL" bobj1 = nil echo "... Done" Run The output below shows that the destructor for `A#1` doesn't get called when `B#1` is destroyed, and hence when the table is supposed to be destroyed. The output also shows another surprise: Creating B#1 Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Destroying A named Setting B#1 to NIL Destroying B named B#1 ... Done Run I haven't looked into it yet, but my guess is that the multiple lines with `Destroying A named` come from the `seq` inside the Table being initialized - that the variable used to initialize the `AObj` field in each table entry goes out of scope and causes the `AObj` destructor to be called.