Consider the following code:
int main()
{
char* str = new char;
str[0] = 'a';
delete[] str; //Notice the []
}
它能够编译、运行且没有崩溃(VC15和g++)。
但是,我可以通过valgrind清晰地看到1个内存泄漏。
然而,如果我运行以下代码:
#include <iostream>
class Foo{
public:
Foo(){
std::cout << "Foo::Foo" << std::endl;
}
~Foo(){
std::cout << "Foo::~Foo" << std::endl;
}
};
int main()
{
Foo* foo = new Foo;
delete[] foo;
return 0;
}
在Windows上运行时,我遇到了析构函数调用的无限循环,在Linux上则出现了无效指针错误(在约20个析构函数调用后)。
我不能理解为什么这两者会有差异?为什么使用new char
不会导致无限循环或崩溃?
new[]
分配的内容上调用delete[]
。 - juanchopanzachar
这样的内置类型生成完全相同的代码,用于delete
和delete[]
。对于具有析构函数的类型,代码则非常不同。 - Bo Persson