在Visual C++中删除和删除[]相同?

HS.*_*HS. 6 c++ visual-c++

我知道,我应该用delete []我使用后new [],所以使用auto_ptrnew []没有这样的好主意.

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

void operator delete[]( void * p )
{
    RTCCALLBACK(_RTC_Free_hook, (p, 0))
    operator delete(p);
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*son 26

考虑以下代码:

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

int main()
{
  DeleteMe *arr = new DeleteMe[5];
  delete arr;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Thanks mate, I'm gone!

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

int main()
{
  DeleteMe *arr = new DeleteMe[5];
  delete[] arr;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它将打印:

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!

不要用脚射击自己.如果你不匹配new/delete的不同风格,VS2005将不会做正确的事情.任何其他C++标准都不符合编译器.

有一些编译器魔法周围发生的operator newoperator delete(和他们的不同口味),基本通话到构建函数和dtors是幕后补充说.这种魔法取决于那些小括号[],所以不要失去它们或者你将失去魔力.