Actually, the assignment operator is needed for both purposes. It's certainly true the destructor prevents some memory leaks, but the assignment operator prevents others, in addition to doing a deep copy.
For example, assume you do this (where MyClass is a poorly-written class that has no assignment operator, and some pointer variable ptr):
MyClass a, b;
a = b;
The assignment does two things:
1. It does a shallow copy of b.ptr to a.ptr, making both pointers point to the same data, leading to the issue you described,
2. Causes a memory leak. Can you see how? Hint: What about the memory that used to be pointed at by a.ptr?