Visual C++中delete和delete[]一样吗?

2024-03-02

我知道我应该使用delete []我使用后new [],所以使用auto_ptr with new []这可不是什么好主意。

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

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

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


考虑这段代码:

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

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

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


Thanks mate, I'm gone!  

如果你改变main()正确遵守 C++ 标准:

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

它将打印:


Thanks mate, I'm gone!
Thanks mate, I'm gone!
Thanks mate, I'm gone!
Thanks mate, I'm gone!
Thanks mate, I'm gone!  

别搬起石头砸自己的脚。 VS2005将NOT如果您不匹配不同风格的 new/delete,请执行正确的操作。任何其他符合 C++ 标准的编译器也不会。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual C++中delete和delete[]一样吗? 的相关文章

随机推荐