当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在VisualC++中删除和删除[]相同?》经验,为你挑选了1个好方法。

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

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

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

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



1> Andreas Magn..:

考虑以下代码:

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!

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

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

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有