Вы не можете избежать этого, потому что вы скопировали все биты object1 в object2, там будет два указателя на одно место, но деструктор будет вызван дважды, потому что есть два объекта.
Первое решениепредотвратит вызов деструктора object2:
char object2_data[sizeof(object1)];
Type* object2 = (Type*) object2_data;
*object2 = object1;
...
object1.do_something();
object2->do_something(); //However, the pointer is different
Второй способ - изменить дизайн объекта и добавить переменную bool, которая сообщит, является ли объект копией.Когда объект удаляется, если это копия, не удаляйте указатель.Наконец, реализуйте конструктор копирования и перегрузите operator =, чтобы скопировать объект, и установите переменную bool, чтобы сообщить, что это копия.Однако, если исходный объект будет удален, копии не будут использоваться, поскольку они будут иметь недопустимые указатели.