将会打印出一个指向0的指针和一个指向非0的指针。例如:
p 0x0 q 0x378d0
auto_ptr::get()返回那个辅助的指针。
这种“转移”语义不同于通常的“复制”语义,这是令人惊讶的。特别地,永远不要使用auto_ptr作为一个标准容器的成员。标准容器需要通常的“复制”语义。例如:
std::vector<auto_ptr<X> >v; // 错误
auto_ptr只持有指向一个单独元素的指针,而不是指向一个数组的指针:
void f(int n)
{
auto_ptr<X> p(new X[n]); //错误
// ...
}
这是错误的,因为析构函数会调用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()兼容。如果这种混合的风格在你的系统中能够运用,只能说是你走运——暂时的。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/