If, at the time of destruction, p is a pointer to an array of memory that was allocated using new and by that point nobody has called delete on it, you need to do it.
Even better, use a modern smart pointer as a member variable and then that smart pointer's destructor will take care of it for you.
Even better, if possible, just have the array be a member variable of the class so you don't need to bother with new and delete.
This class could allocate memory using new that will never ever be deleted. This is bad.
It could also (the first time operator= is used) call delete on p when p is not pointing at memory that was allocated using new. This is also very bad.
This class gets memory wrong, and has a good chance of crashing the first time operator= is called.
I have a default constructor and an overloaded constructor, both use the new keyword to allocate dynamic memory. As a habit when I use new I put delete in there somewhere. I was wondering if it was needed this time or if the destructor clears the memory automatically.
I don't know how many times to keep answering this same question. Yes, you need to use delete.
As a habit when I use new I put delete in there somewhere.
That's not a terrible habit to have, but a better habit is that every time you put new, press backspace a few times to remove it and then either put the variable on the stack, or if it simply must go on the heap, use a smart pointer and make_unique or make_shared.