In the C ++ 1998 standard (ISO / IEC 14882 First edition, 1998-09-01), the operation of the deletion expression is quite simply outlined in "Section 5.3.5" Deleting [expr.delete] "in clauses 6 and 7.
6 The expression expression will call the destructor (if any) for the object or elements of the array to be deleted. In the case of an array, the elements will be destroyed in the decreasing order of the address (i.e., in the reverse order of completion of their constructor; see 12.6.2).
7 The expression expression will call the release function (3.7.3.2).
In combination, these sentences require that the destructor be called (or destructors for the array) and that the release function be called unconditionally. There is no provision that you do not call the release function if an exception is thrown.
In the 1998 standard, language lawyers and compiler developers are likely to enjoy sophistry to discuss a different interpretation than I said above. Fortunately, in later standards things are clearer ...
In draft N4296, available from open-std.org , the same sentences are expanded as follows: (from the memory, the wording in the official standard is the same, but I do not have a copy on my current computer)
(my accent)
6 If the operand value of the delete-expression is not a null pointer value, the expression-expression will call the destructor (if any) for the object or elements of the deleted array. In the case of an array, the elements will be destroyed in descending order of the address (i.e., in the reverse order of completion of their constructor, see 12.6.2).
7 If the value of the operand of the delete-expression is not the value of a null pointer, then:
(7.1). If the allocation call for the new expression for the object to be deleted was not omitted and the distribution was not expanded (5.3.4), delete-expression should call the release function (3.7.4.2). The value returned from the distribution invocation of the new expression is passed as the first argument to the release function.
(7.2) - Otherwise, if the distribution was expanded or was provided by expanding the allocation of another new expression and the deletion expression for any other pointer value created by the new expression that had storage, the extension provided by the new expression was evaluated, delete-expression should call the release function. The value returned from the distribution invocation of the extended new expression is passed as the first argument to the release function.
(7.3) - Otherwise, the expression delete will not call the release function (3.7.4.2).
Otherwise, it is not indicated whether the release function will be called. [Note: The release function is called regardless of whether the destructor for the object or any element of the array throws an exception. - end of note]
The note at the end said that the release function should be called even if the destructor throws an exception.
I'm not sure which evolution of the standard was originally written, but based on the foregoing, the items will probably remain in section 5.3.5 (tag [expr.delete]).