荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]那个auto_ptr是什么东东啊?为什么没有a
发信站: 荔园晨风BBS站 (Sun Jun 13 12:15:11 2004), 站内信件


Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?
A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的。它
使用“资源分配即初始化”技术来保证资源在发生异常时也能被安全释放(“
exception safety”)。一个auto_ptr封装了一个指针,也可以被当作指针来使用
。当其生命周期到了尽头,auto_ptr会自动释放指针。例如:
#include<memory>
using namespace std;

struct X {
int m;
// ..
};

void f()
{
auto_ptr<X> p(new X);
X* q = new X;

p->m++; // use p just like a pointer
q->m++;
// ...

delete q;
}
如果在代码用// ...标注的地方抛出异常,那么p会被正常删除——这个功劳应该
记在auto_ptr的析构函数头上。不过,q指向的X类型对象就没有被释放(因为不是
用auto_ptr定义的)。详情请见《The C++ Programming Language》14.4.2节。
Auto_ptr是一个轻量级的类,没有引入引用计数机制。如果你把一个auto_ptr(比
如,ap1)赋给另一个auto_ptr(比如,ap2),那么ap2将持有实际指针,而ap1将
持有零指针。例如:

#include<memory>
#include<iostream>
using namespace std;

struct X {
int m;
// ..
};

int main()
{
auto_ptr<X> p(new X);
auto_ptr<X> q(p);
cout << "p " << p.get() << " q " << q.get() << "\n";
}


运行结果应该是先显示一个零指针,然后才是一个实际指针,就像这样:
p 0x0 q 0x378d0


auto_ptr::get()返回实际指针。
这里,语义似乎是“转移”,而非“拷贝”,这或许有点令人惊讶。特别要注意的
是,不要把auto_ptr作为标准容器的参数——标准容器要求通常的拷贝语义。例如


std::vector<auto_ptr<X> >v; // error

一个auto_ptr只能持有指向单个元素的指针,而不是数组指针:

void f(int n)
{
auto_ptr<X> p(new X[n]); // error
// ...
}


上述代码会出错,因为析构函数是使用delete而非delete[]来释放指针的,所以后
面的n-1个X没有被释放。
那么,看来我们应该用一个使用delete[]来释放指针的,叫auto_array的类似东东
来放数组了?哦,不,不,没有什么auto_array。理由是,不需要有啊——我们完
全可以用vector嘛:

void f(int n)
{
vector<X> v(n);
// ...
}


如果在 // ... 部分发生了异常,v的析构函数会被自动调用。




--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店