这是错误的,因为析构函数会调用delete而不是delete[]来释放指针,这样就不会调用余下的n-1个X的析构函数。
那么我们需要一个auto_array来持有数组吗?不。没有auto_array。原因是根本没有这种需要。更好的解决方案是使用vector:
void f(int n)
{
vector<X> v(n);
// ...
}
当...部分发生异常时,v的析构函数会被正确地调用。
可以混合使用C风格与C++风格的内存分派与重新分配吗?
在这种意义上是可以的:你可以在同一个程序中使用malloc()和new。
在这种意义上是不行的:你不能使用malloc()来建立一个对象,又通过delete来释放它。你也不能用new建立一个新的对象,然后通过free()来释放它,或者通过realloc()在数组中再建立一个新的。
C++中的new和delete操作可以保证正确的构造和析构:构造函数和析构函数在需要它们的时候被调用。C风格的函数alloc(), calloc(), free(), 和realloc()却不能保证这一点。此外,用new和delete来获得和释放的原始内存,并不一定能保证与malloc()和free()兼容。如果这种混合的风格在你的系统中能够运用,只能说是你走运——暂时的。
如果你觉得需要使用realloc()——或者要做更多——考虑使用标准库中的vector。例如:
// 从输入中将词读取到一个字符串vector中
vector<string> words;
string s;
while (cin>>s && s!=".") words.push_back(s);
vector会视需要自动增长。
更多的例子与讨论,参见我的文章《将标准C++作为一种新的语言来学习》(Learning Standard C++ as a New Language),你可以在本人著作列表(my publications list)中下载到它。
我为什么必须使用一个造型来转换*void?
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/