web-dev-qa-db-ja.com

std :: shared_ptrで.reset()を使用すると、すべてのインスタンスが削除されますか

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つであり、値を返すときにクリーンアップが自動的に行われますか?

24
zeus_masta_funk

.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 

pqは両方ともオブジェクトの所有者であり、pqの両方がリセットされると、then theインスタンスは破棄されます。

41
Dietrich Epp

いいえ、shared_ptrの目的は、誰かが別の場所で使用している場合、ある場所から削除できないことです。 sp.reset()はuse_countを1つ減らし、そのオブジェクトをnullptrに置き換えます。

10
Alex Telishev

.reset()メソッドは、呼び出されたオブジェクトにのみ適用されます。

変数が保持しているポインターを置き換えるだけです。

1
Yochai Timmer