C++程序设计的一种常用技术——智能指针(smart pointer),主要内容包括引用计数(reference count)和句柄类(handle class)。 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。
|
|
- #include <iostream>
- using namespace std;
- class U_Ptr { // 计数类, 我们不希望普通用户使用,所以都为 private
- private :
- friend class HasPtr;
- private :
- U_Ptr(int *p) : ip(p), use(1) {}
- ~U_Ptr() {delete ip;}
- int *ip;
- size_t use;
- };
- class HasPtr {
- public :
- HasPtr(int *p, int i) : ptr(new U_Ptr(p)), val(i) {}
- HasPtr(const HasPtr &orig) : ptr(orig.ptr), val(orig.val) {++ptr->use;}
- HasPtr& operator=(const HasPtr&);
- ~HasPtr() {
- if((--ptr->use) == 0) delete ptr;
- }
- private :
- U_Ptr *ptr;
- int val;
- };
- HasPtr& HasPtr::operator=(const HasPtr &rhs) {
- ++rhs.ptr->use;
- if(--ptr->use == 0) {
- delete ptr;
- }
- ptr = rhs.ptr;
- val = rhs.val;
- return *this;
- }
- int main() {
- return 0;
- }
#include <iostream>
#include <stdexcept>
#define BUG cout << "here\n";
using namespace std;
#define TEST_SMARTPTR
class Stub {
public:
void print() {
cout<<"Stub: print"<<endl;
}
~Stub(){
cout<<"Stub: Destructor"<<endl;
}
};
template <typename T>
class SmartPtr {
public:
SmartPtr(T *p = 0): ptr(p), pUse(new size_t(1)) { }
SmartPtr(const SmartPtr& src): ptr(src.ptr), pUse(src.pUse) {
++*pUse;
}
SmartPtr& operator= (const SmartPtr& rhs) {
// self-assigning is also right
++*rhs.pUse;
decrUse();
ptr = rhs.ptr;
pUse = rhs.pUse;
return *this;
}
T *operator->() {
if (ptr)
return ptr;
throw std::runtime_error("access through NULL pointer");
}
const T *operator->() const {
if (ptr)
return ptr;
throw std::runtime_error("access through NULL pointer");
}
T &operator*() {
if (ptr)
return *ptr;
throw std::runtime_error("dereference of NULL pointer");
}
const T &operator*() const {
if (ptr)
return *ptr;
throw std::runtime_error("dereference of NULL pointer");
}
~SmartPtr() {
decrUse();
#ifdef TEST_SMARTPTR
std::cout<<"SmartPtr: Destructor"<<std::endl; // for testing
#endif
}
private:
void decrUse() {
--(*pUse); // 虚析构
if (*pUse == 0) { //
delete ptr;
delete pUse;
}
}
T *ptr;
size_t *pUse;
};
int main() {
try {
SmartPtr<Stub> t;
t->print();
} catch (const exception& err) {
cout << err.what() << endl;
}
BUG
SmartPtr<Stub> t1(new Stub);
SmartPtr<Stub> t2(t1);
SmartPtr<Stub> t3(new Stub);
BUG
t3 = t2;
BUG
t1->print();
BUG
(*t3).print();
return 0;
}
312



被折叠的 条评论
为什么被折叠?



