C++ 智能指针 shared_ptr weak_ptr和unique_ptr
目前见到最好的shared_ptr和weak_ptr在这里
附上相关测试代码
#include <iostream>
#include <time.h>
#include <unordered_map>
#include <vector>
#include <stack>
#include <queue>
#include <unordered_set>
#include <algorithm>
#include <list>
#include <memory>
using namespace std;
#define mySquare(x) (x)*(x) //宏定义对于每个参数都加一个()
class Solution
{
public:
//21_0121 最长不含重复字符字串 leetcode 03
int lengthOfLongestSubstring(string s) {
if(s.size() == 0) return 0;
int res = 0;
int left = 0;
unordered_map<char,int> unmap;
for(int i =0;i<s.size();i++)
{
left = max(left,unmap[s[i]]);
unmap[s[i]] = i +1;
res = max(res,i-left+1);
}
return res;
}
int lengthOfLongestSubstringTwo(string s) {
if(s.size() == 0) return 0;
int len = s.size();
int res = 1;
for(int i =1;i<s.size();i++)
{
unordered_set<char> curSet;
int left = i-1;
int right = i+1;
curSet.insert(s[i]);
while(left >= 0 && (curSet.find(s[left]) == curSet.end()))
{
curSet.insert(s[left]);
left--;
}
while(right < len && (curSet.find(s[right]) == curSet.end()))
{
curSet.insert(s[right]);
right++;
}
int tmpLength = right - left -1;
res = max(tmpLength,res);
}
return res;
}
};
class CB;
class CA
{
public:
CA(){cout<<"CA() called"<<endl;}
~CA(){cout<<"~CA() called"<<endl;}
void set_ptr(shared_ptr<CB>& ptr) {m_ptr_b = ptr;}
void b_use_count()
{
cout<<"b use count is "<<m_ptr_b.use_count()<<endl;
}
void show()
{
cout<<"this is class CA"<<endl;
}
void testCA();
private:
shared_ptr<CB> m_ptr_b;
};
void CA::testCA()
{
cout<<"This is testCA"<<endl;
}
class CB
{
private:
weak_ptr<CA> m_ptr_a;
public:
CB(){cout<<"CB() called"<<endl;}
~CB(){cout<<"~CB() called"<<endl;}
void set_ptr(weak_ptr<CA> ptr)
{
m_ptr_a = ptr;
}
void show()
{
cout<<"this is class CB"<<endl;
}
};
void test_refer_to_eachOther()
{
shared_ptr<CA> ptr_a(new CA());
shared_ptr<CB> ptr_b(new CB());
cout<<"a use count is "<<ptr_a.use_count()<<endl;
cout<<"b use count is "<<ptr_b.use_count()<<endl;
ptr_a->set_ptr(ptr_b);
ptr_b->set_ptr(ptr_a);
cout<<"after set "<<endl;
cout<<"a use count is "<<ptr_a.use_count()<<endl;
cout<<"b use count is "<<ptr_b.use_count()<<endl;
}
void test1()
{
cout<<"begin in test1 function "<<endl;
shared_ptr<CA> ptr_1(new CA());
shared_ptr<CA> ptr_2 = ptr_1;
weak_ptr<CA> wk_ptr1 = ptr_1;
weak_ptr<CA> wk_ptr2(ptr_1);
cout<<"ptr1 use_count is "<<ptr_1.use_count()<<endl;
}
void test2()
{
cout<<"begin in test2 function"<<endl;
shared_ptr<CA> ptr_a(new CA());
shared_ptr<CB> ptr_b(new CB());
weak_ptr<CA> wk_ptr_a = ptr_a;
weak_ptr<CB> wk_ptr_b = ptr_b;
if(!wk_ptr_a.expired())
{
wk_ptr_a.lock()->show();
}
if(!wk_ptr_b.expired())
{
wk_ptr_b.lock()->show();
}
//wk_ptr_a.swap(wk_ptr_b); //编译错误,非同类引用指针类型无法调用swap函数
wk_ptr_b.reset();
if(wk_ptr_b.expired()) cout<<"In test2 wk_ptr_b is invalid"<<endl;
cout<<"In test2 last "<<ptr_a.use_count()<<" "<<ptr_b.use_count()<<endl;
}
int main()
{
test_refer_to_eachOther();
test1();
test2();
/*
int* a = new int(10);
std::shared_ptr<int> sPtr(a);
std::shared_ptr<int> sPtr1(sPtr);
std::shared_ptr<int> sPtr2 = make_shared<int>(10);
std::shared_ptr<int> sPtr3(sPtr);
int curCount = sPtr.use_count();
cout<<"curCount is "<<curCount<<endl;
sPtr3.reset();
cout<<"after reset "<<sPtr.use_count()<<endl;
if(sPtr.get()) cout<<"sPtr is not null"<<endl;
std::shared_ptr<int> sPtr4 = sPtr;
cout<<"*sPtr4 is "<<*sPtr4<<" sPtr.usecount is "<<sPtr.use_count()<<endl;
int* b = new int(11);
std::shared_ptr<int> sPtr5(b);
cout<<"*sPtr5 is "<<*sPtr5<<endl;
std::shared_ptr<int> sPtr6 = sPtr5;
cout<<"sPtr6 is "<<*sPtr6<<endl;
*/
time_t now_time = time(NULL);
tm* thisLocalTime = localtime(&now_time);
cout<<endl;
cout<<asctime(thisLocalTime)<<endl;
system("pause");
return 0;
}
还有一篇shared_ptr简单介绍在这里 https://blog.csdn.net/jacke121/article/details/106805898,但是他写的有些是错误的。比如shared_ptr<int> sptr2 = sptr1; 这个是可行的。
unique_ptr部分待补充。

字节跳动公司福利 1307人发布