主题索引:
一、剖析C++标准库智能指针(std::auto_ptr)
1.Do you Smart Pointer?
2.std::auto_ptr的设计原理
3.std::auto_ptr高级使用指南
4.你是否觉得std::auto_ptr还不够完美?
二、C++条件,寻找构造更强大的智能指针(Smart Pointer)的
策略
1.支持引用记数的多种设计策略
2.支持处理多种资源
3.支持Subclassing
4.支持多线程条件下,线程安全的多种设计策略
5.其它多种特殊要求下,再构造
三、Generic Programming基础技术和Smart Pointer
1.回首处理资源中的Traits技术
2.回首多线程支持的设计
四、COM实现中,Smart Pointer设计原理
五、著名C++库(标准和非标准)中的Smart Pointer现状
---------------------------------------------------------------------
一、剖析C++标准库智能指针(std::auto_ptr)
1.Do you Smart Pointer?
Smart Pointer,中文名:智能指针, 舶来品?
不可否认,资源泄露(resource leak)曾经是C++程序的一大噩梦.垃圾回收
机制(Garbage Collection)一时颇受注目.然而垃圾自动回收机制并不能
满足内存管理的即时性和可视性,往往使高傲的程序设计者感到不自在.
况且,C++实现没有引入这种机制.在探索中,C++程序员创造了锋利的
"Smart Pointer".一定程度上,解决了资源泄露问题.
也许,经常的,你会写这样的代码:
//x拟为class:
// class x{
// public:
// int m_Idata;
// public:
// x(int m_PARAMin):m_Idata(m_PARAMin){}
// void print(){ cout<<m_Idata<<endl; }
// .....
// }
//
void fook(){
x* m_PTRx = new A(m_PARAMin);
m_PTRx->DoSomething(); //#2
delete m_PTRx;
}
是的,这里可能没什么问题.可在复杂、N行、m_PTRclassobj所指对象生命周
期要求较长的情况下,你能保证你不会忘记delete m_PTRclassobj吗?生活中,
我们往往不应该有太多的口头保证,我们需要做些真正有用的东西.还有一个
更敏感的问题:异常.假如在#2方法执行期异常发生,函数执行终止,那么new
出的对象就会泄露.于是,你可能会说:那么就捕获异常来保证安全性好了.
你写这样的程式:
void fook(){
A* m_PTRx = new A(m_PARAMin);
try{
m_PTRx->DoSomething();
}
catch(..){
delete m_PTRx;
throw;
}
delete m_PTRx;
}
哦!天哪!想象一下,你的系统,是否会象专为捕获异常而设计的.
一天,有人给你建议:"用Smart Pointer,那很安全.".你可以这样重写你的程序:
void fook(){
auto_ptr<x> m_SMPTRx(new x(m_PARAMin));
m_SMPTRx->DoSomething();
}
OK!你不太相信.不用delete吗?
是的.不用整天提心吊胆的问自己:"我全部delete了吗?",而且比你的delete
策略更安全.
然后,还有人告诉你,可以这样用呢:
ok1.
auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
auto_ptr<x> m_SMPTR2(m_SMPTR1); //#2
May be you can code #2 like this :
auto_ptr<x> m_SMPTR2;
m_SMPTR2 = m_SMPTR1;
ok2.
auto_ptr<int> m_SMPTR1(new int(32));
ok3.
auto_ptr<int> m_SMPTR1;
m_SMPTR1 = auto_ptr<int>(new int(100));
也可以:
auto_ptr<int> m_SMPTR1(auto_ptr<int>(new int(100)));
ok4.
auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
m_SMPTR1.reset(new x(m_PARAMin1));
ok5.
auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
auto_ptr<x> m_SMPTR2(m_SMPTR.release());
cout<<(*m_SMPTR2).m_Idata<<endl;
ok6.
auto_ptr<int> fook(){
return auto<int>(new int(100));
}
ok7.............and so on
但不可这样用:
no1.
char* chrarray = new char[100];
strcpy(chrarray,"I am programming.");
auto_ptr<char*> m_SMPTRchrptr(chrarray);
//auto_ptr并不可帮你管理数组资源
no2.
vector<auto_ptr<x>> m_VECsmptr;
m_VECsmptr.push_back(auto_ptr<int>(new int(100)));
//auto_ptr并不适合STL内容.
no3.
const auto_ptr<x> m_SMPTR1(new x(100));
auto_ptr<x> m_SMPTR(new x(200));
no4.
x m_OBJx(300);
auto_ptr<x> m_SMPTR(&m_OBJx);
no5
x* m_PTR = new x(