C ++中的智能指针知识
考虑以下简单的C ++代码与正常的指针。
MyClass *ptr = new MyClass();
ptr->doSomething();
// We must do delete(ptr) to avoid memory leak
智能指针在游戏开发中经常使用,使用智能指针,我们可以使指针以我们不需要显式调用delete的方式工作。 智能指针是一个包含类的操作符,如*和 - >重载的指针。 智能指针类的对象看起来像指针,但可以做许多事情,一个普通的指针不能自动破坏(是的,我们不必明确地使用delete),引用计数等等。
这个想法是使用一个指针,析构函数和重载运算符(如*和 - >)来创建一个类。 由于当对象超出范围时自动调用析构函数,所以动态分配的内存将自动删除(或引用计数可以递减),考虑以下简单的smartPtr类。
-
#include<iostream>
-
using namespace std;
-
-
class SmartPtr
-
{
-
int *ptr; // Actual pointer
-
public:
-
// Constructor: Refer #/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:
20
我们可以编写一个适用于所有类型的智能指针类吗?
是的,我们可以使用模板来编写一个通用的智能指针类,以下C ++代码演示一样。
-
#include<iostream>
-
using namespace std;
-
-
// A generic smart pointer class
-
template <class T>
-
class SmartPtr
-
{
-
T *ptr; // Actual pointer
-
public:
-
// Constructor
-
explicit SmartPtr(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:
20智能指针在管理资源(如文件句柄或网络套接字)中也很有用。
C ++库以auto_ptr,unique_ptr,shared_ptr和weak_ptr的形式提供智能指针的实现,