Those two statements do not do the same thing.
Your first piece of code is missing the malloc. You only call free on something you have allocated with malloc.
More importantly, you should not use malloc/free with C++ classes (there is little reason to use them at all in C++). This is because malloc does not call the MyObject constructor and free does not call the destructor.
That is the difference between malloc/free and new/delete. The C++ version calls constructors and destructors.
Finally, it is valid to assign the pointer to a new location after you have deleted it, because the pointer itself is still there. You just have to make sure you don't attempt to use the MyObject that it used to be pointing to. It might seem to work, but you would be accessing memory that has been freed to be used somewhere else and will likely end up causing a crash.