我正在尝试解决一个类中包含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 从未被引用并在函数结束时超出范围,那么这样做的意义是什么?我尝试将该行删除,但似乎没有任何区别,然而这一行出现在很多示例中!我是否错过了一些非常明显的东西,或者是盲目地从示例复制了一个异常代码行,并在许多“教程”中普遍存在?
pC
指向的“对象”已经被销毁,因此他们的表现可能与他们预期的不太一样。 - Steve Jessopoperator new
和operator delete
几乎肯定不是一个好主意。此外,注意您的operator new
是有问题的,它在抛出异常之前应该按顺序调用所有的new_handler
。/编辑:忘记了评论的第一部分,我没有注意到这是在一个类内部。评论的第二部分仍然正确。 - Konrad Rudolphoperator new
本来就很靠不住,所以找另一个教程可能会更好。 - Steve Jessop