When object A refers to object B via a custom property, duplicating A creates extra links on B.
Create a new scene with two objects, select the objects.
Run this in Python console:
bpy.types.Object.custom_reference = bpy.props.PointerProperty(type=bpy.types.Object, name="Test")
bpy.context.selected_objects.custom_reference = bpy.context.selected_objects
Now you should see one of the objects having 2 (two) links in its datablock, as it should, and Custom Properties of the other should show the property.
Duplicate the referring object and check the other one. It will now have 4 (four) links, instead of 3. Delete the duplicate. The number of links will go down to 3 (three). Delete the last one with the custom property. Number of links will be 2.
Recreate the scene as above and duplicate the referring object. The target should again have the (incorrect) four links. Select all three objects and duplicate them. In that new trio, the copy of target will have a correct number of links (three). But the number of links on the original goes up to 6.