Shared_ptrは初めてで、.reset()関数の正確な機能を理解しようとしています。
#include <memory>
#include <stdio>
using namespace std;
class SomeClass{};
int main()
{
shared_ptr<SomeClass> sp (nullptr);
//do some stuff, sp now has 10 co-owners
cout << sp.use_count << endl;
sp.reset();
cout << sp.use_count << endl;
return 0;
}
出力しますか
10
0
リセット機能を使用したため、すべてのインスタンスがメモリから削除されますか?同様に、spでメモリリークの可能性を排除しましたか?明らかにこれは私がすぐに作り上げたおもちゃの例でしたが、エラーがあれば申し訳ありません。
フォローアップ状況:
shared_ptr<SomeClass> returnThis() {
shared_ptr<SomeClass> someObject(new SomeClass(/*default constructor for example*/) );
return someObject;
}
メインのどこかに:
shared_ptr<SomeClass> mainObject;
mainObject = returnThis();
SomeObjectは関数で作成されたがクリアされなかったため、mainObjectの使用カウントは2ですか?それとも1つであり、値を返すときにクリーンアップが自動的に行われますか?
.reset()
を使用すると、ポインターの所有者oneが削除されますが、他の所有者はすべて残っています。次に例を示します。
#include <memory>
#include <cstdio>
class Test { public: ~Test() { std::puts("Test destroyed."); } };
int main()
{
std::shared_ptr<Test> p = std::make_shared<Test>();
std::shared_ptr<Test> q = p;
std::puts("p.reset()...");
p.reset();
std::puts("q.reset()...");
q.reset();
std::puts("done");
return 0;
}
プログラム出力:
p.reset()... q.reset()... テストが破壊されました。 done
p
とq
は両方ともオブジェクトの所有者であり、p
とq
の両方がリセットされると、then theインスタンスは破棄されます。
いいえ、shared_ptrの目的は、誰かが別の場所で使用している場合、ある場所から削除できないことです。 sp.reset()はuse_countを1つ減らし、そのオブジェクトをnullptr
に置き換えます。
.reset()メソッドは、呼び出されたオブジェクトにのみ適用されます。
変数が保持しているポインターを置き換えるだけです。