ref: http://c.biancheng.net/view/7898.html
c++的智能指针是通过引用计数实现的
智能指针在申请堆内存空间时,会有一个整形值,初始化为1
每当有新对象使用该堆内存时,+1,对象被释放时-1,整形值为0时,释放该堆空间。
#include <memory>
#include <iostream>
using namespace std;
void getNum(shared_ptr<int> p);
void test1() {
shared_ptr<int> p;
cout << p.use_count() << endl; // 0
getNum(p);
cout << p.use_count() << endl; // 0
// segmentation fault
cout << *p << endl;
}
void getNum(shared_ptr<int> p) {
cout << p.use_count() << endl; // 0
p = make_shared<int>(10);
cout << p.use_count() << endl; // 1
}
int main() {
test1();
return 0;
}
#include <memory>
#include <iostream>
using namespace std;
void getNum(shared_ptr<int> p);
void test1() {
shared_ptr<int> p = make_shared<int>(100);
cout << p.use_count() << endl; // 1
getNum(p);
cout << p.use_count() << endl; // 1
// 100 另一个函数不能改变p指向的值
cout << *p << endl;
}
void getNum(shared_ptr<int> p) {
cout << p.use_count() << endl; // 2
p = make_shared<int>(10);
cout << p.use_count() << endl; // 1
}
int main() {
test1();
return 0;
}
#include <memory>
#include <iostream>
using namespace std;
void getNum(shared_ptr<int>& p);
void test1() {
shared_ptr<int> p = make_shared<int>(100);
cout << p.use_count() << endl; // 1
getNum(p);
cout << p.use_count() << endl; // 1
// 这样就正常了 因为操作的是同一个指针
cout << *p << endl;
}
void getNum(shared_ptr<int>& p) {
cout << p.use_count() << endl; // 1
p.reset(new int(10));
cout << p.use_count() << endl; // 1
}
int main() {
test1();
return 0;
}