Страницы

Поиск по вопросам

пятница, 26 октября 2018 г.

Разница между delete и operator delete

В чём разница между этими действиями?
static void operator delete (void *p) { ::delete p; } static void operator delete (void *p) { ::operator delete(p); }
Кажется, что всё работает в обоих случаях: https://ideone.com/cQ8lTJ
#include
using namespace std;
struct a { static void operator delete (void *p) { ::delete p; } }; struct b { static void operator delete (void *p) { ::operator delete(p); } };
int main() { delete new a(); delete new b();
cout << "Done :)" << endl;
return 0; }
Но если добраться до предупреждений компилятора https://ideone.com/bN3XOh
prog.cpp: In static member function ‘static void a::operator delete(void*)’: prog.cpp:5:62: warning: deleting ‘void*’ is undefined [-Wdelete-incomplete] struct a { static void operator delete (void *p) { ::delete p; } }; ^
то возникает ощущение, что он предупреждает о UB в первом варианте.
Действительно ли это UB? Если да, то почему это всего лишь предупреждение, а не ошибка?
PS: Из похожего нашёл такой вопрос, но там про внутреннее устройство вызова delete, причём не показывается, почему именно код из моего вопроса неверный.


Ответ

operator delete - это функция. ::operator delete(p); - это вызов этой функции.
Выражение delete p; - это вызов деструктора, поиск указателя на полный объект и вызов функции operator delete для этого полного объекта. Операция delete для void* не имеет смысла, о чем и говорит компилятор. В контексте другой функции operator delete оно особенно не имеет смысла.

Более подробно про выражение delete и функции operator delete можно почитать тут

Комментариев нет:

Отправить комментарий