Замена 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: я не сталкивался с такой практикой для наведения указателя на конкретный класс, но если вы встретите такой совет в учебном пособии, то вы можете изменить его.

Другие вопросы по тегам