【问题标题】:delete and delete [] the same in Visual C++?在Visual C++ 中delete 和delete [] 一样吗?
【发布时间】:2008-11-19 09:14:25
【问题描述】:

我知道我应该在使用new [] 之后使用delete [],所以使用auto_ptrnew [] 并不是一个好主意。

但是,在调试 delete [](使用 Visual Studio 2005)时,我注意到调用进入了如下所示的函数:

void operator delete[]( void * p )
{
    RTCCALLBACK(_RTC_Free_hook, (p, 0))
    operator delete(p);
}

这是否意味着 [] 语法在 Visual C++ 上丢失了?如果是这样,为什么?是不是为了减轻开发者记住正确语法的负担?

【问题讨论】:

  • delete [] p 不等于 operator delete[](p)

标签: c++ visual-c++


【解决方案1】:

考虑这段代码:

class DeleteMe
{
public:
  ~DeleteMe()
  {
    std::cout << "Thanks mate, I'm gone!\n";
  }
};

int main()
{
  DeleteMe *arr = new DeleteMe[5];
  delete arr;
  return 0;
}

如果你在 VS2005 中运行它会打印:

谢谢老哥,我走了!

如果您更改 main() 以正确遵守 C++ 标准:

int main()
{
  DeleteMe *arr = new DeleteMe[5];
  delete[] arr;
  return 0;
}

它将打印:

谢谢老哥,我走了!
谢谢大佬,我走了!
谢谢大佬,我走了!
谢谢大佬,我走了!
谢谢老哥,我走了!

不要朝自己的脚开枪。如果您不匹配新/删除的不同风格,VS2005 将做正确的事情。任何其他符合 C++ 标准的编译器也不会。

operator newoperator delete(以及它们的不同风格)周围发生了一些编译器魔法,基本上对ctors 和dtors 的调用是在幕后添加的。这个魔法取决于那些小括号 [],所以不要失去它们,否则你会失去魔法。

【讨论】:

    【解决方案2】:

    我想这只是一个实现细节。在释放数组和指针时,它们的堆分配器的工作方式相同。

    但是由于标准允许实现对这两种情况使用不同的算法,因此您真的不应该假设 deletedelete[] 做同样的事情。行为甚至可能在编译器版本之间发生变化。

    【讨论】:

      【解决方案3】:

      仅仅因为它们现在的工作方式可能相同,并不意味着您一定可以对它们一视同仁——行为可能会改变。此外,谁在乎 - 你应该编写你的代码,这样你就不必记住了。

      另外,您可以使用scoped_array 进行数组删除。

      【讨论】:

      • 我知道,我们应该,但到目前为止我们还没有使用 Boost。 :(
      • 我相信 scoped_array(和其他 Boost 智能指针类型)是 TR1 的一部分。如果没有 Boost,您可能已经拥有它们。
      • 我错过了关于 VS2005 的部分。我认为 TR1 在 VS2008 SP1 中。
      【解决方案4】:

      也许您删除的数据没有析构函数?如果是这样,这个简单的删除将是有意义的。毕竟它正在处理 void* 。

      无论如何,您应该使用 delete[] 来确保为数组中的每个元素运行析构函数。

      【讨论】:

        【解决方案5】:

        删除不带 [] 的数组只会释放内存,但不会调用数组中每个对象的析构函数。所以,从技术上讲,如果你的析构函数需要被调用,你只需要 []。

        【讨论】:

        • 我肯定会修改你的第一个陈述,因为它不正确和危险,即使你在最后给出了正确的解释。
        • 你是对的,VS 2005 确实在乎。他们甚至在运行时检测到问题。我很久以前测试过这个,所以我猜MS已经改变了它。
        • 如果你省略[],你会召唤鼻恶魔。
        猜你喜欢
        • 2011-10-20
        • 2011-06-07
        • 2020-05-06
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 2016-08-17
        • 2022-01-11
        相关资源
        最近更新 更多