我知道,我应该用delete []
我使用后new []
,所以使用auto_ptr
与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!
不要用脚射击自己.如果你不匹配new/delete的不同风格,VS2005将不会做正确的事情.任何其他C++标准都不符合编译器.
有一些编译器魔法周围发生的operator new
和operator delete
(和他们的不同口味),基本通话到构建函数和dtors是幕后补充说.这种魔法取决于那些小括号[],所以不要失去它们或者你将失去魔力.