クラスがあります。このクラスがインスタンス化されたら、インスタンスをリストに追加します。オブジェクトが削除されたら、リストから削除します。
そのため、オブジェクトにそれ自体への共有ポインターを与えます。次に、これらの共有ポインターへの弱いポインターのリストを取得します。オブジェクトが作成されると、それ自体への共有ポインターが作成され、それへの弱いポインターが作成され、その弱いポインターがリストに入れられます。
オブジェクトが破棄されると、共有ポインターも破棄されます。リスト内のメンバーにアクセスしようとするときはいつでも、有効期限が切れていないこと、およびその使用回数が 0 でないことを確認します。それにもかかわらず、リスト メンバーが破棄されるとクラッシュします。なんで?私はそれを回避できますか?これが私のSSCCEです:
#include <iostream>
#include <memory>
#include <vector>
class test
{
private:
std::shared_ptr<test> self;
public:
int val;
test(int set);
test(test ©) = delete; // making sure there weren't issues
// with a wrong instance being deleted
};
std::vector<std::weak_ptr<test>> tests;
test::test(int set):
val(set)
{
this->self = std::shared_ptr<test>(this);
tests.push_back(std::weak_ptr<test>(this->self));
}
void printTests()
{
for (auto i = tests.begin(); i != tests.end(); i++)
{
if (i->use_count() == 0 || i->expired())
{
tests.erase(i);
continue;
}
std::cout << i->lock()->val << std::endl;
}
std::cout << std::endl;
}
int main(int argc, char **argv)
{
{
test t(3);
std::cout << "First tests printing: " << std::endl;
printTests();
} // SEGFAULTS HERE
std::cout << "Second tests printing: " << std::endl;
printTests();
return 0;
}
このプログラムの出力は次のとおりです。
First tests printing:
3
Segmentation fault (core dumped)