gpt4 book ai didi

c++ - delete 和 delete [] 在 Visual C++ 中是否相同?

转载 作者:可可西里 更新时间:2023-11-01 18:40:42 26 4
gpt4 key购买 nike

我知道我应该在使用 new [] 之后使用 delete [],所以使用 auto_ptrnew [] 不是一个好主意。

但是,在调试 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!

If you change main() to correctly adhere to the C++ standard:

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 将做正确的事情。任何其他符合 C++ 标准的编译器也不会。

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

关于c++ - delete 和 delete [] 在 Visual C++ 中是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/301357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com