详情:(299条消息) C++ 智能指针 - 全部用法详解_cpp_learners的博客-CSDN博客
一.智能指针的引用
看以下代码
如果p->foo()代码出现异常,那么就会停止在这一步,这样的话未能执行delete p便会出现内存泄漏(内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。最终的结果就是导致OOM。内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序)
void some_func(){
Object*p = new Object;
p->foo();
delete p;
}
二.auto_ptr(智能指针)
二.shared_ptr(共享指针)
shared_ptr一块内存资源不再使用时,shared_ptr会自动帮你释放
shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。
1.初始化
shared_ptr<int> p1 = make_shared<int>(); //p1指向一个值初始化的即为int
cout << *p1 << endl; //指针解引用,当为()时默认输出为0
cout << p1.use_count() << endl; //返回与p共享对象的智能指针数量,输出为1
shared_ptr<string>p2 = make_shared<string>(10, '9'); //p4指向一个值初始化为string的
cout << *p2 << endl; //输出为9999999999
2.共享操作
当进行拷贝或赋值操作,每个shared_ptr会记录有多少个其他shared_ptr指向相同的对象
auto p = make_shared<int>(43); //p指向的对象只有p一个引用者
auto q(p); //p和q指向相同对象,此时有两个
auto r = make_shared<int>(42);
r = q;
cout << p.use_count(); //输出为3
3.show the code
class Ball {
public:
Ball() {
cout << "A ball appears." << endl;
}
~Ball() {
cout << "A ball disaappears." << endl;
}
void Bounce() {
cout << "A ball jumps." << endl;
}
};
int main() {
shared_ptr<Ball> p = make_shared<Ball>();
cout << p.use_count() << endl; //输出为1
shared_ptr<Ball> p2 = p;
cout << p.use_count() << " " << p2.use_count() << endl; //输出为2,2
shared_ptr<Ball> p3 = p;
cout << p.use_count() << " " << p2.use_count() << " " << p3.use_count(); //输出为3,3,3
return 0;
}
三.unique_ptr
unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)
class Ball {
public:
Ball() {cout << "A ball appears." << endl;}
~Ball() {cout << "A ball disaappears." << endl;}
void Bounce() {cout << "A ball jumps." << endl;}
};
void func() {
cout << "Now in func" << endl;
unique_ptr<Ball> up = make_unique<Ball>();
up->Bounce();
cout << "Before quiting func" << endl;
}
int main() {
cout << "Now in main." << endl;
func();
cout << "End Executing func." << endl;
return 0;
}