スマートポインタの使用と注意事項
6222 ワード
xi 1.なぜスマートポインターを使うのですか?opencvでは、なぜスマートポインタを使うかについての説明がとても上手です.Default constructor、copy constructtor、and assignment operator for an arbitrry C++class structure.For some offect、like files、windows、mutes、mutexes、soures、soures、torcopy constststststststrutos are absent and noeat t t t t t t t to implement.Finally、some of coplex OpenCV and your own dataststststucucucucrereremay y be written n in C.However、copy ststststrererereresststststrerererererereststststststststrerererererererereres ststststststststststststststststststststrererererererererererererererererererererereeees ststststststststststststststststststststSTL containers)By using a Ptr to such an object instead of the object itself,you auttic ally get all of the necessary construct and the assigment operator. O(1)coplexity of the above-mentiond operation.While some structres,like sted:vector,provide a copy construct and assigment operator,the operation mary mastreet able able of stres.structure.stres.the overhead is small and independent of the data size. Automatic and customizable cleanup,even for C structures. Heterogeneous collection s of objecs.The standard STL and most other C++and OpenCV containers can store only Oobject s of the same type and the same size.The classition soution soution store store of theinstead but then you lose the atomatic memory management.Again,by using Ptr instead of raw pointers,you can solive the proble.@note The the shared mechange ism ism is implement with reference counting.As.As,cleject.will lead to all involved object never being cleaned up.Avoid such situations@note It is safe to concurrently read(but not write)a Ptr instance from multile threads and therefore it is normally safe to use it in multi-threaded aplications.The same is true for Mat and other C+OpenCV class that use internal ference counts.1を使用するのに便利なメモリです.ptr基本用法直接コード
ハ3知能ポインタsharred_ptr使用総括shared_ptrの使用まとめ:(1)内部でthisを伝えるには、enableからの脱却を考えてください.shared_fromthis継承はenableから_shared_fromthisを継承すると、クラスの対象はshared_を譲らなければなりません.ptr引き継ぎ、enable_を使うshared_fromthis機構はクラス内部からthisを伝達する.(2)スマートポインタを使うなら、すべてスマートフォンを使って、raw pointer裸針の使用を最小限に抑える.(3)C++はごみ収集がなく、資源管理は自分でやるべきです.スマートポインタは資源管理の仕事を部分的に解決できますが、万能ではありません.(4)スマートポインタを使うときは、shared_ごとにptrオブジェクトには名前があるべきです.つまり、一つの表式で複数のリソースの初期化を避けることです.(5)shared_を避けるptrの相互参照.weak_を使うptrクロスを破る(6)資源管理は統一されたスタイルを維持するか、スマートポインタを使うか、または全部自分で裸の指針を管理する.4スマートポインタweak_ptr使用
3インテリジェントポインターunique_ptr使用
#include
#include
#include
#include
using namespace std;
int main()
{
// two shared pointers representing two persons by their name
//shared_ptr pNico(new string("nico"));
shared_ptr pNico{new string("nico")};
// shared_ptr pNico;
// pNico.reset(new string("nico"));
shared_ptr pJutta(new string("jutta"));
// capitalize person names
(*pNico)[0] = 'N';
pJutta->replace(0,1,"J");
// put them multiple times in a container
vector> whoMadeCoffee;
whoMadeCoffee.push_back(pJutta);
whoMadeCoffee.push_back(pJutta);
whoMadeCoffee.push_back(pNico);
whoMadeCoffee.push_back(pJutta);
whoMadeCoffee.push_back(pNico);
// print all elements
for (auto ptr : whoMadeCoffee) {
cout << *ptr << " ";
}
cout << endl;
// overwrite a name again
*pNico = "Nicolai";
// print all elements again
for (auto ptr : whoMadeCoffee) {
cout << *ptr << " ";
}
cout << endl;
// print some internal data
cout << "use_count: " << whoMadeCoffee[0].use_count() << endl;
return 0;
}
注意して、コンパイルする時はadd_を加えます.definitions(-g-std=c+11)c+11を使ってスマートポインタを新規作成する方法(1)sharred(uptr pNico(new string);(2)shared_ptr pNico{new string}(3)reet shred_を使用するptr pNico 4pNico4.5 reet(new string);(4)メークを使うshared(「nico」)は最後にuse_を呼び出すことができることを推奨します.count()は参照数を出力します.注意してください.スマートポインタは手動でdeleteを起動しないでください.システムはアメリカにあります.count()=0は自動的にメモリを放出します.ハ3知能ポインタsharred_ptr使用総括shared_ptrの使用まとめ:(1)内部でthisを伝えるには、enableからの脱却を考えてください.shared_fromthis継承はenableから_shared_fromthisを継承すると、クラスの対象はshared_を譲らなければなりません.ptr引き継ぎ、enable_を使うshared_fromthis機構はクラス内部からthisを伝達する.(2)スマートポインタを使うなら、すべてスマートフォンを使って、raw pointer裸針の使用を最小限に抑える.(3)C++はごみ収集がなく、資源管理は自分でやるべきです.スマートポインタは資源管理の仕事を部分的に解決できますが、万能ではありません.(4)スマートポインタを使うときは、shared_ごとにptrオブジェクトには名前があるべきです.つまり、一つの表式で複数のリソースの初期化を避けることです.(5)shared_を避けるptrの相互参照.weak_を使うptrクロスを破る(6)資源管理は統一されたスタイルを維持するか、スマートポインタを使うか、または全部自分で裸の指針を管理する.4スマートポインタweak_ptr使用
#include
#include
#include
#include
using namespace std;
class Person {
public:
string name;
Person (const string& n) : name(n) { cout<> vPersons(3,nullptr);
shared_ptr mom(new Person(" mom"));
cout< > vPerson;
weak_ptr wmom(mom);
vPerson.push_back(wmom);
cout< > vPerson2;
vPerson2.push_back(wmom.lock());
cout<
(1)shared_ptrは一回使うと、引用カウントは一回(2)weak_を加算します.ptrを一回使用すると、引用カウントは増加しません.(3)参照weak_ptrの引用数は、対応するshared_です.ptrの引用数(4)weak_ptr.lock()shared_を返します.ptr、戻ったらshared_ptrが使用され、参照カウントが増加します.3インテリジェントポインターunique_ptr使用
#include
#include
#include
#include
using namespace std;
class Person {
public:
string name;
Person (const string& n) : name(n) { cout<person)
{
}
unique_ptr< Person> ReturnPerson(unique_ptr< Person>person)
{
return person;
}
int main()
{
//1create way1
unique_ptr pNico(new Person("nico"));
//2create way2
unique_ptr pJack(new Person("jack"));
unique_ptr pLucy(new Person("lucy"));
//3delete using reset or =nullptr
//pNico.reset();
pNico=nullptr;
//4.error use!!
//UsePerson(pJack);
//5.person will be delete
UsePerson(std::move(pJack));
if(nullptr==pJack)
{
cout< rLucy=ReturnPerson(move(pLucy));
// 7.replaced nico
pLucy.reset(new Person("logon"));
return 0;
}
(1)新規用newで新規作成しますので、等号unique_は使えないように注意してください.ptr pNico(new string);(2)resetまたは=nullptrを使用して削除すると、構文関数(3)を呼び出してmove()を使用してオブジェクトの所有権を移動します(4)unique_ptrは関数パラメータとしてmove()を追加します.そうでないと(5)を使ってunique_を返すことができません.ptrの時、システムは自動的にmove()をプラスして(6)reset(new)を使って、もとのオブジェクトを削除して、新しいオブジェクトに設定します.pLucy.reet(new Person);lucyオブジェクトを削除して、pLucyがlognオブジェクトを指すように設定します.