一.来源
int* p = new int;
*p = 10;
delete p;
看上面这段代码,每次定义指针,分配空间后,都需要最后delete,释放空间。因此,C++想怎么可以让指针自动释放。
先看普通指针:
public:
A(int a, int b) {
this->a = a;
this->b = b;
}
~A() {
cout << "-------执行析构函数" << endl;
}
void print() {
cout << "a=" << a << ",b=" << b << endl;
}
private:
int a;
int b;
};
void Test1() {
//普通指针写法
A* p1 = new A(1, 2);
p1->print();
(*p1).print();
//delete p1;
}
int main() {
Test1();
}
结果:在注释delete p1时,并没有触发析构函数。
取消注释delete p1,触发析构函数。
二.C++自带智能指针
需要引入头文件:
#include <memory>
以及:
auto_ptr<A> ptr(new A(1, 2));
改写上面方法:
class A {
public:
A(int a, int b) {
this->a = a;
this->b = b;
}
~A() {
cout << "-------执行析构函数" << endl;
}
void print() {
cout << "a=" << a << ",b=" << b << endl;
}
private:
int a;
int b;
};
void Test1() {
//智能指针
auto_ptr<A> ptr(new A(1, 2));
ptr->print();
(*ptr).print();
}
int main() {
Test1();
}
结果:自动触发了析构函数,说明智能指针在使用完后自动释放,不需要手动delete。
三.手动定义智能指针
class A {
public:
A(int a, int b) {
this->a = a;
this->b = b;
}
~A() {
cout << "-------执行析构函数" << endl;
}
void print() {
cout << "a=" << a << ",b=" << b << endl;
}
private:
int a;
int b;
};
//自定义智能指针类
class MyAutoPtr {
private:
A* ptr;
public:
MyAutoPtr(A* ptr) {
cout << "MyAutoPtr(void* ptr)" << endl;
this->ptr = ptr;
}
~MyAutoPtr() {
cout << "~MyAutoPtr()" << endl;
if (this->ptr != nullptr) {
delete this->ptr;
this->ptr = nullptr;
}
}
//重写->操作符
A* operator->() {
return this->ptr;
}
//重写*操作符
A& operator*() {
return *ptr;
}
};
void Test2() {
MyAutoPtr ptr(new A(1, 2));
ptr->print();//等价于ptr.operator->()->print();
(*ptr).print();
}
int main() {
Test2();
}
结果: