9

我正在尝试(并已解决)包含 SSE 优化成员的类的 16 字节对齐问题。但困扰我的是我在网上找到的大部分示例都包含一行代码,在我看来这些代码完全是多余的,但在许多地方却重复出现。

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 从未被引用并且在函数末尾超出范围,那么这样做有什么意义呢?我试过把这条线拿出来,它似乎根本没有什么区别,但这条线出现在很多例子中!我是否遗漏了一些非常明显的东西,或者是否有异常的代码行被盲目地从一个示例复制到另一个示例,并在许多“教程”中变得普遍?

4

2 回答 2

2

一旦进入析构函数,对象就结束了它的生命周期,所以你不能用这个指针做很多事情。该行Camera* pC = static_cast<Camera*>(p);可以安全地删除,它存在于教程中的唯一原因是许多人只是在这里和那里复制粘贴代码,而没有真正考虑它是如何工作的。

干净且正确的代码delete()如下所示:

void operator delete (void *p)
{
    _aligned_free(p);
}
于 2012-07-25T10:07:23.427 回答
0

正如您对问题的许多评论中所讨论的那样,以下行确实是多余的:

Camera* pC = static_cast<Camera*>(p);  // Just an unused variable

即使p是 之前的类型Camera*(其他可能性是子类,如Canon*, Sony*, Nikon*),您仍然无法对 做太多事情pC,因为Camera::~Camera()应该已经调用了 。operator delete之后调用。

PS:我还没有遇到过这种将指针指向特定类的做法,但是如果您在教程中遇到这样的建议,那么您可能需要更改它。

于 2012-07-25T09:54:17.810 回答