geeksforgeeks-063-c++中的智能指针

考虑下面的程序:

1
2
3
MyClass *ptr = new MyClass();
ptr->doSomething();

使用智能指针,我们可以不需要显示地调用delete。
下面是一个简单的智能指针类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
using namespace std;

class SmartPtr
{
int *ptr; // Actual pointer
public:
// Constructor: Refer http://www.geeksforgeeks.org/g-fact-93/
// for use of explicit keyword
explicit SmartPtr(int *p = NULL) { ptr = p; }

// Destructor
~SmartPtr() { delete(ptr); }

// Overloading dereferencing operator
int &operator *() { return *ptr; }
};

int main()
{
SmartPtr ptr(new int());
*ptr = 20;
cout << *ptr;

// We don't need to call delete ptr: when the object
// ptr goes out of scope, destructor for it is automatically
// called and destructor does delete ptr.

return 0;
}

Output:

1
20

我们能否实现一个对所有类型都适用的智能指针类?
可以,通过使用模板。如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
using namespace std;

// A generic smart pointer class
template <class T>
class SmartPtr
{
T *ptr; // Actual pointer
public:
// Constructor
explicit (T *p = NULL) { ptr = p; }

// Destructor
~SmartPtr() { delete(ptr); }

// Overloading dereferncing operator
T & operator * () { return *ptr; }

// Overloding arrow operator so that members of T can be accessed
// like a pointer (useful if T represents a class or struct or
// union type)
T * operator -> () { return ptr; }
};

int main()
{
SmartPtr<int> ptr(new int());
*ptr = 20;
cout << *ptr;
return 0;
}

Output:

1
20

C++库提供了一些智能指针的实现 auto_ptr, unique_ptr,shared_ptr and weak_ptr