【问题标题】:Replacing delete in C++, missinformation在 C++ 中替换删除,错误信息
【发布时间】:2012-07-25 08:41:29
【问题描述】:

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

【问题讨论】:

  • 我可能会这样做的一个原因是协助调试。使用 '_aligned_free(p);' 上的断点,我可以检查 Camera* pC 对象。
  • 如果示例始终是Camera,那么它肯定是从一个教程复制到另一个教程。盲目地或其他方式。
  • 不,Camera 是我自己的类 - 用每个教程中的类名替换它:)
  • 重载全局operator newoperator delete 几乎肯定不是一个好主意。另外,请注意您的operator new 已损坏,因为它应该在投掷之前依次调用所有new_handlers。 /编辑:忘记评论的第一部分,我没有注意到这是在一个类中。评论的第二部分仍然有效。
  • @StuartEagles:也许您应该链接到包含代码的许多地方中的 3 或 4 个。评论教程的整个部分可能比评论几行代码更容易,我同意,这些代码看起来不协调。正如 Konrad 所说,operator new 无论如何都是狡猾的,所以甚至可能最好找到另一个教程。

标签: c++ replace delete-operator static-cast


【解决方案1】:

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

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

void operator delete (void *p)
{
    _aligned_free(p);
}

【讨论】:

    【解决方案2】:

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

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

    即使 p 之前是 Camera* 类型(其他可能性是子类,如 Canon*Sony*Nikon*),您仍然无法使用 pC,因为 @987654328 @ 应该已经被调用了。之后调用operator delete

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

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多