# NoDestructor が scoped_refptr を持つなという話 タイトルの通り。 scoped_refptr とは 標準ライブラリでいう shared pointer のことで、リファレンスカウントをしてくれるポインタ。 リファレンスがゼロになったら開放される。 詳しくは過去のノート[scoped_refptr in Chromium](https://github.com/elkurin/elkurin-daily-notes/blob/main/docs/day17.md) を参照。 一方NoDestructorとは[ChromiumのSingleton](https://github.com/elkurin/elkurin-daily-notes/blob/main/docs/day9.md)にて紹介したが、以下のように`static`と組み合わせることでシングルトンとして機能する。 ```cpp= static T* GetInstance() { static base::NoDestructor<T> instance; return instance.get(); } ``` これは名前の通りDestructorを呼ばない。 なぜなら実体を`char`型として持っているため。 では scoped_refptr を持ったオブジェクトが NoDestructor で宣言されているオブジェクトやそのchildsにあるとどうなるか? 一生リファレンスが生き続けているので、そのオブジェクトはデストラクタが呼ばれない。 おそらくRefCountedクラスのオブジェクトにとってこれは意図する挙動ではないと思うので気をつけよう。 ## unique ptr でこういう例はあんまりみない この話は別にscoped_refptrに固有性のある話題ではなく、オブジェクト本体やunique ptrなどでも同様だが、なんとなく見かけない気がしている。 scoped_refptrの場合raw_ptr的に扱われがちな印象があるからかな。