В чём разница между этими действиями?
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 можно почитать тут
Комментариев нет:
Отправить комментарий