The preliminary patch in a good hint and I committed it for now as it does improve the situation. To be included in the next version.
I've spent a couple hours today trying to find out, what the real fix should look like. The source of the issue is that the CUPS API actually doesn't give you a way to get a single printer (destination in CUPS lingo). Instead, you always deal with lists of destinations and you can only free() the whole list (using cupsFreeDests). This does not match with Net::CUPS' structure in which Net::CUPS::Destination objects are independent of each other.
The proper fix will be to add a Net::CUPS::Destinations wrapper for the whole list and have Net::CUPS::Destination objects reference this list and index into it. This way Net::CUPS::Destinations' destructor can free the whole list when the last reference to it goes away.