替换C++中的删除,信息缺失

Replacing delete in C++, missinformation

本文关键字:信息 删除 C++ 替换      更新时间:2023-10-16

我正在尝试(并且已经解决)一个包含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从未被引用,并且在函数结束时超出了范围,所以这样做有什么意义?我试着把这条线去掉,但它似乎没有任何区别,但这条线出现在很多例子中!我是不是遗漏了一些非常明显的东西,还是有一行异常的代码被盲目地从一个例子复制到另一个例子,并在许多"教程"中流行起来?

一旦进入析构函数,对象就会结束其生存期,因此您无法对该指针执行太多操作。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()应该已经被调用了。之后调用CCD_ 10。

附言:我还没有遇到过这样的做法来将指针投射到特定的类,但如果你在教程中遇到这样的建议,那么你可能想更改它。