原标题:C ++中的智能指针
考虑以下带有普通指针的简单C ++代码。
MyClass *ptr = new MyClass();
ptr->doSomething();
// We must do delete(ptr) to avoid memory leak
使用智能指针,我们可以指示工作方式,我们不需要显式调用delete。智能指针是指针上的包装类,运算符如*和 - >重载。 智能指针类的对象看起来像指针,但可以执行许多事情,正常的指针不能像自动销毁(是的,我们不必显式使用删除),引用计数等等。
我们的想法是创建一个带有指针,析构函数和重载运算符(如*和 - >)的类。由于当对象超出范围时会自动调用析构函数,因此动态分配的内存将自动删除(或者引用计数可以递减)。考虑以下简单的smartPtr类。
#include
using namespace std;
class SmartPtr
{
int *ptr; // Actual pointer
public:
// Constructor: Refer https://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;
}
输出:
20
我们可以编写一个适用于所有类型的智能指针类吗?
是的,我们可以使用模板编写通用的智能指针类。以下C ++代码演示相同。
#include
using namespace std;
// A generic smart pointer class
template
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 ptr(new int());
*ptr = 20;
cout << *ptr;
return 0;
}
输出:
20
智能指针在管理资源时也很有用,例如文件句柄或网络套接字。
C ++库以auto_ptr,unique_ptr,shared_ptr和weak_ptr的形式提供智能指针的实现返回搜狐,查看更多
责任编辑: