????4. unique_ptr???????auto_ptr??
?????????????????????????????unique_ptr???????auto_ptr??????????????????????????????
??????????????:
????auto_ptr<string> p1(new string ("auto") ?? //#1
????auto_ptr<string> p2;                       //#2
????p2 = p1;                                   //#3
?????????#3?У?p2???string????????????p1?????????????????????????????£?????p1??p2???????????????—??????
??????????????????????p1??????????£????p1?????????Ч???????
???????????????unique_ptr???????
????unique_ptr<string> p3 (new string ("auto");   //#4
????unique_ptr<string> p4??                       //#5
????p4 = p3;                                      //#6
????????????????#6???????????p3?????????Ч?????????????unique_ptr??auto_ptr???????
??????unique_ptr???и???????????
??????????????????????????????????????Σ???????????????????o??????壺
????unique_ptr<string> demo(const char * s)
????{
????unique_ptr<string> temp (new string (s))??
????return temp??
????}
???????????д?????′???
????unique_ptr<string> ps;
????ps = demo('Uniquely special")??
????demo()??????????unique_ptr?????ps?????????鷵???unique_ptr???е???????????????? unique_ptr ?????????????л?????? unique_ptr ????????Ч??????????仰????????????????????κ??????????????????????????????????????????????????????????unique_ptr????????????
??????????????????????? unique_ptr ????????????????? unique_ptr ???????????????????????????????? unique_ptr ?????????????????????????????????磺
????unique_ptr<string> pu1(new string ("hello world"));
????unique_ptr<string> pu2;
????pu2 = pu1;                                      // #1 not allowed
????unique_ptr<string> pu3;
????pu3 = unique_ptr<string>(new string ("You"));   // #2 allowed
????????#1?????????unique_ptr(pu1)??????????Σ??????#2?????????????unique_ptr??????????? unique_ptr ??????????ù?????????????????????????????? pu3 ???????????????????????????????unique_ptr ????????????????auto_ptr ??
????????????????????????????#1????????????????????????????????????????????????????????????????????????????????????????????????C++????????????std::move()??????????????unique_ptr??????????????????????????demo()????????????ú??????????unique_ptr<string>????
???????move??????????????????????????????????????????
????unique_ptr<string> ps1?? ps2;
????ps1 = demo("hello");
????ps2 = move(ps1);
????ps1 = demo("alexia");
????cout << *ps2 << *ps1 << endl;
????5. ?????????????
???????????????????????????????????????????????????У???????????????????
??????????????????????
??????1??????????????????????????????????shared_ptr?????????????????
???????????????飬??????Щ?????????????????????????????С??????
?????????????????????????????????
????STL??????????????STL?????????????????????Щ??????????shared_ptr????????????unique_ptr????????????warning????auto_ptr??????????????????????????????shared_ptr???????Boost??????shared_ptr??
??????2????????????????????????????????????unique_ptr????????????new??????棬????????????????????????????????unique_ptr??????????????????????????????????unique_ptr????????????????????delete?????unique_ptr?洢??STL??????????????????y????unique_ptr??????????????????sort()???????磬??????????????????????????Ρ?
unique_ptr<int> make_int(int n)
{
return unique_ptr<int>(new int(n));
}
void show(unique_ptr<int> &p1)
{
cout << *a << ' ';
}
int main()
{
...
vector<unique_ptr<int> > vp(size);
for(int i = 0; i < vp.size(); i++)
vp[i] = make_int(rand() % 1000);              // copy temporary unique_ptr
vp.push_back(make_int(rand() % 1000));     // ok because arg is temporary
for_each(vp.begin()?? vp.end()?? show);           // use for_each()
...
}
????????push_back??????????????????????????unique_ptr????unique_ptr??????vp?е????unique_ptr????????????????????????show()???????for_each()??????????????????????????vp??????unique_ptr?????pi?????????????????????????????????????????unique_ptr???????
??????unique_ptr???????????丳??shared_ptr?????????unique_ptr?????????????????????????????????????????????У?make_int()??????????unique_ptr<int>??
????unique_ptr<int> pup(make_int(rand() % 1000));   // ok
????shared_ptr<int> spp(pup);                       // not allowed?? pup as lvalue
????shared_ptr<int> spr(make_int(rand() % 1000));   // ok
???????shared_ptr????????????????????????????unique_ptr????shared_ptr??shared_ptr??????????unique_ptr???е????
??????????unique_ptr?????????????????auto_ptr????unique_ptr???????????????????????unique_ptr??????????Boost??????scoped_ptr??????unique_ptr?????