У меня есть класс. Когда этот класс создается, я хочу, чтобы экземпляр был добавлен в список. Когда объект удален, я хочу, чтобы он был удален из списка.Автоматическое добавление и удаление объекта из списка
Так что я даю объекту общий указатель на себя. Затем у меня есть список слабых указателей на эти общие указатели. Когда объект создается, он создает общий указатель на себя, делает слабый указатель на него и помещает слабый указатель в список.
Когда объект уничтожен, общий указатель также. Всякий раз, когда я пытаюсь получить доступ к члену в списке, я гарантирую, что он не истек, и что его количество использования не равно 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)
я буду практически * гарантия * вы, что 'this-> само = станд :: shared_ptr (это),' не делать то, что вы думаете, это, тем более, что реальный объект, 'тест т (3) ', находится в * стеке *. –
WhozCraig
То, что это в стеке, означает, что тест уничтожается в конце его области, и это то, что я хочу.Как еще я буду делать то, что хочу? – Avi
Как вы думаете, 'std :: shared_ptr <>' делает с указателем объекта, содержащимся внутри, когда разрушен общий ptr obj? – WhozCraig