From the C++1y draft:
5.3.5 Delete [expr.delete]
[...]
11 When a delete-expression is executed, the selected deallocation function shall be called with the address of the block of storage to be reclaimed as its first argument and (if the two-parameter deallocation function is used) the size of the block as its second argument.83
Footnote 83) If the static type of the object to be deleted is complete and is different from the dynamic type, and the destructor is not
virtual, the size might be incorrect, but that case is already undefined, as stated above.
17.6.4.6 Replacement functions [replacement.functions]
1 Clauses 18 through 30 and Annex D describe the behavior of numerous functions defined by the C++ standard library. Under some circumstances, however, certain of these function descriptions also apply to replacement functions defined in the program (17.3).
2 A C++ program may provide the definition for any of twelve dynamic memory allocation function signatures declared in header
(3.7.4, 18.6):
operator new(std::size_t)
operator new(std::size_t, const std::nothrow_t&)
operator new[](std::size_t)
operator new[](std::size_t, const std::nothrow_t&)
perator delete(void*)
operator delete(void*, const std::nothrow_t&)
operator delete[](void*)
operator delete[](void*, const std::nothrow_t&)
note by me: The next four are new in C++1y
operator delete(void*, std::size_t)
operator delete(void*, std::size_t, const std::nothrow_t&)
operator delete[](void*, std::size_t)
operator delete[](void*, std::size_t, const std::nothrow_t&)
3 The program’s definitions are used instead of the default versions supplied by the implementation (18.6). Such replacement occurs prior to program startup (3.2, 3.6). The program’s definitions shall not be specified as inline. No diagnostic is required.
Also take a look at the proposal which introduces sized deallocation in C++1y:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3536.html