Замена delete в C++, неверная информация
Я пытаюсь (и решил) проблему с 16-байтовыми проблемами выравнивания с классом, который содержит оптимизированные SSE члены. Но что меня беспокоит, так это большая часть примеров, которые я нашел в Интернете, которые содержат строку кода, которая мне кажется совершенно избыточной, но повторяется во многих местах.
public:
void* operator new (size_t size)throw (std::bad_alloc)
{
void * p = _aligned_malloc(size, 16);
if (p == 0) throw std::bad_alloc();
return p;
}
void operator delete (void *p)
{
Camera* pC = static_cast<Camera*>(p);
_aligned_free(p);
}
Строка, о которой идет речь,
Camera* pC = static_cast<Camera*>(p);
Поскольку pC никогда не ссылается и выходит из области видимости в конце функции, какой смысл делать это? Я попытался убрать строку, и, похоже, ничего не изменилось, но эта строка появляется во многих примерах! Я пропускаю что-то действительно очевидное или аномальная строка кода копируется слепо из примера в пример и становится распространенной во многих "учебниках"?
2 ответа
Объект завершает свою жизнь, как только деструктор вводится, так что вы не можете многое сделать с этим указателем. Линия Camera* pC = static_cast<Camera*>(p);
может быть безопасно удалено, и единственная причина, по которой он существует в учебниках, заключается в том, что многие люди просто копируют и вставляют код здесь и там, не задумываясь о том, как он работает.
Чистый и правильный код для вашего delete()
будет выглядеть следующим образом:
void operator delete (void *p)
{
_aligned_free(p);
}
Как обсуждалось во многих комментариях к вашему вопросу, следующая строка действительно избыточна:
Camera* pC = static_cast<Camera*>(p); // Just an unused variable
Даже если p
был типа Camera*
до (другие возможности, такие как Canon*
, Sony*
, Nikon*
), вы все еще не можете многое сделать с pC
, поскольку Camera::~Camera()
должен был уже позвонить. operator delete
называется после этого.
PS: я не сталкивался с такой практикой для наведения указателя на конкретный класс, но если вы встретите такой совет в учебном пособии, то вы можете изменить его.