Adam, I'm about to encounter a very similar problem, so would be curious if you find a good solution, although your thoughts with reg.finalizer look promising. The thoughts I had sketched out for tackling this problem:
1) Have all ancillary resources freed when the package is detached. The new() function would create the object, allocate additional resources, and store some kind of handle for these resources in the package environment as a cleanup object. The cleanup object is then referenced when .Last.lib() is run, and all ancillary resources are deallocated. 2) Write methods for rm() / remove() that cleanup the resources at the same time as removing the object from the environment. A handle to these resources would have to be stored either with the object like you suggested, or in a cleanup object (like #1) that stores the handles of every object needing cleanup. Conceptually, #2 seems very similar to your suggestion of using reg.finalizer. However, it had seemed to make more sense (to me) to deallocate resources at rm() time rather than gc() time, as I had thought that garbage collection happened at R's convenience, rather than when the user explicitly removes the object from the environment (which is presumably garbage collected sometime later). However, any information about the mechanics of removal and garbage collection, and the correct way to cleanup objects is greatly appreciated, as I had never quite understood when reg.finalizer should be used. As a corollary, I have some concern that if R quits, then the garbage collector never runs (and rm() and .Last.lib() as well). The resources in my case are database objects that may need to be altered or deleted after the corresponding R object is removed (or R quits), and I have yet to find any solution that runs at quit time (although maybe rewriting the q() function might not be a bad idea, although I'm hesitant to rewrite base code). Let me know if you come up with anything more elegant. Best, Robert -----Original Message----- From: Adam Lyon [mailto:[EMAIL PROTECTED] Sent: Friday, January 07, 2005 1:36 PM To: r-help@stat.math.ethz.ch Subject: [R] Destructor for S4 objects? Hi, To write a "constructor" for an S4 object, you make an initialize method which will be called by new. But how would I make a "destructor" method to be called when the S4 object is garbage collected? I'm looking at reg.finalizer, but I'm not sure how to make that work for an S4 object. I want to write a destructor because my S4 object's initialize method allocates some resources. I would like the destructor to free them. I guess I could make one of the slots in my object an environment that holds the handles for those resources and register that environment with the finalizer. Then the finalizer function would release those resources. Is that the way to do it or is there another simpler way? Thanks for any help and Happy New Year! Adam Lyon ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html