我有一堂课。实例化此类时,我希望将实例添加到列表中。删除对象后,我希望将其从列表中删除。
所以我给对象一个指向它自己的共享指针。然后我有一个指向这些共享指针的弱指针列表。当一个对象被创建时,它会创建一个指向自身的共享指针,创建一个指向它的弱指针,并将弱指针放入一个列表中。
当对象被销毁时,共享指针也被销毁。每当我尝试访问列表中的成员时,我都会确保它没有过期并且它的使用计数不为 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)