In the same place [on a steppe] in a lecture it seems to be intelligibly told ...
And so, yes, the operation new / new[] consists of two actions: the actual allocation of memory and the call of the constructor. These two actions can be divided by calling the operator new (size_t size) / operator new[] (size_t size) separately - for memory allocation and, in fact, placement new ( new (ptr) Type(ctor_args...) ) to call the constructor and create an object.
Actually then manually have to destroy the object. Those. call the destructor manually:
ptr->~Type();
Then clear the memory with operator delete (ptr)/operator delete[] (ptr)
When you mix placement new and destruction with delete, you yourself are trying to shoot in the foot. Exactly as in the opposite direction.
For example, when calling new[] , memory can be allocated more than requested (we will not go into the nuances of the work of allocators) and objects are not constructed from the beginning of the memory block, but from some indentation and the pointer value is returned to this indent. And in the reserved place is saved including. the number of objects in the array: this information can then be used delete[] to correctly understand how many destructors need to be called. How this will be implemented in a specific compiler is a matter of implementation. But therefore it is impossible to interfere with new / delete[] and new[] / delete : the form of the operator helps the compiler to draw correct conclusions about the structure of the memory. For the same reason, placement new and delete / delete[] cannot be interfered with - in general, the host new can be called for a memory block that has been allocated in some user way: from some system area, from a pool, from some custom allocator etc. delete after destroying the object also tries to free it. What will happen - only Cthulhu is known. And delete[] can still suggest some kind of its structure and start operating with an invalid pointer.
In general - be symmetrical.