Heh, I can tell you come from the land of C and know a bit about malloc. Remember, gdscript is a scripting language. An object never dies unless there are no more references to that object, this is a mandatory requirement. So, being able to even call weakref, means that "node" still exists in some sense of the word. You may have done "node = k", and some other thread called "k.deallocate(); k = null", but that other thread can't make you lose the validity of "node" as an object, because that would violate the idea of a scripting a language. The main idea here, is that "node"/"k" will likely only contain an object_id, and then a pointer to the rest of the data. that pointer will be set to null "k.deallocate" is called, so that now "node" refers to a "deallocated node", but it still "exists", just as lonely null pointer and its old objectid. And, the 8 bytes used to keep track of the obj_id and the pointer will be deallocated whenever the variable "node" gets updated to reference something else, and the garbage collector cleans it up because neither "node" nor "k" reference it anymore. Regardless of weakref, it would be unacceptable to call some function on a node and then it magically calls the function on a different node instead because the node was deallocated and then reallocated. In summary, "node.queuefree()" will make the node and invalid node, but not destroy it completely.