From your post:
Delete Deallocates storage previously allocated by a matching operator new.
When you use:
float x, y; x = y = 0;
float * p = &x;
delete p;
you are not following that statement.
p does not point to an object that was allocated by operator new. It points to a local variable on the stack.
With your updated code, you did allocate memory by calling new but you changed p so that it points to a variable on the stack.
float *p = new float(3.4);  // p points to object returned by new
float x, y; x = y = 0;
p = &x;                     // p points to x. The previous memory is leaked
Consequently,
- Your program has a memory leak.
- Your program is still subject to undefined behavior when it executes delete p;.
What’s the solution to fixing the following code.
Solution 1 Don’t use p after the line delete p; as though it is a valid pointer since it is not.
Solution 2 Allocate new memory, assign it to p and use p only after that.
int main(){
  float *p = new float(3.4);
  delete p; // I need to delete p right at this part of code.
  p = new float; // Allocate new memory
  *p = 2.1;
  std::cout << *p;
  delete p;      // Deallocate the memory before program ends
}
9
solved Can’t reallocate memory after deleting a static/dynamic pointer