我知道我应该使用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(使用前将#替换为@)