C では、スマート ポインタが一般的なプログラミング テクノロジになっており、開発者がメモリを管理し、メモリ リーク、ワイルド ポインタ、その他の問題によるプログラムのクラッシュを回避するのに役立ちます。ただし、面接官は、候補者のメモリ管理の理解と習熟度をテストするために、スマート ポインターに関連する質問をすることがよくあります。ここでは、スマート ポインターの面接でよくある質問をいくつか紹介します。
スマート ポインタは、動的に割り当てられたメモリを管理し、メモリ リークを回避できるポインタに似たオブジェクトです。スマート ポインターは、管理するオブジェクトを追跡し、不要になったときに自動的に解放します。スマート ポインターには、shared_ptr と unique_ptr の 2 つの主なタイプがあります。
unique_ptr とshared_ptr はどちらもスマート ポインターですが、主な違いはメモリ所有権の管理方法です。 unique_ptr は、オブジェクトの唯一の所有権を持つことができ、コピーできない排他的なスマート ポインターです。また、shared_ptr は、複数のオブジェクト間で所有権を共有できる共有スマート ポインターであるため、コピーすることができます。
さらに、 unique_ptr は std::move 関数を通じてオブジェクトの所有権を譲渡できますが、shared_ptr にはこの関数がありません。 unique_ptr は 1 つのオブジェクトのみが所有できるため、メモリ管理方法はより安全です。
オブジェクトがそれを指すweak_ptrのみを持っている場合、その参照カウントは増加しません。したがって、weak_ptr が存在しても、shared_ptr がすべて破棄されていれば、このオブジェクトは解放されます。このオブジェクトを指すshared_ptrがまだ存在する場合、weak_ptrはlock()関数を通じて有効なshared_ptrを取得し、取得中にオブジェクトが解放されないようにすることができます。
shared_ptr は、参照カウントを使用してオブジェクトの所有権を追跡します。標準ライブラリは、オブジェクトを指すshared_ptrの数を記録するカウンターを維持します。カウンタが 0 に達すると、メモリ リークを避けるためにオブジェクトが自動的に解放されます。これは、shared_ptr が参照カウントを維持し、同じオブジェクトを指すshared_ptrの数を記録するためです。最後のshared_ptrが破棄されると参照カウントがゼロになり、同時にポイントされていたヒープメモリが解放されます。
循環参照は、他のオブジェクトのshared_ptrを相互に保持し、循環を形成する2つ以上のオブジェクトを指します。この場合、参照カウントが 0 ではないため、オブジェクトは解放されず、メモリ リークが発生します。循環参照を回避するために、所有権を持たないオブジェクトへの参照を管理するために一般にweak_ptrが使用され、それによって循環参照リングが壊れます。同時に、クラスにメンバー関数shared_from_this()を提供できるstd::enable_shared_from_thisを使用することもでき、この関数はこのオブジェクトを指すshared_ptrを返すことができます。このようにして、クラス内のオブジェクトが別のクラスのshared_ptrを必要とする場合、オブジェクトのshared_ptrを保持する必要はなく、オブジェクトのshared_from_this()関数を呼び出すことで有効なshared_ptrを取得でき、次の問題を回避できます。循環参照。
概要
スマート ポインタは C における重要なメモリ管理方法であり、メモリ リークやワイルド ポインタなどの問題を効果的に回避できます。面接では、スマート ポインターのさまざまな特性と使用シナリオを理解することが重要であり、C 言語の理解と習熟を示すだけでなく、応募者のコード セキュリティ意識と優れたプログラミング能力も示します。
以上がC++ のスマート ポインターのインタビューに関するよくある質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。