Я пытаюсь получить управляемый объект сглаженного общего указателя. Моя идея заключалась в использовании слабого указателя. Так как слабые указатели не дают никаких объектов, я думал, что создание слабого указателя из общего указателя заставит слабый указатель забыть сохраненный объект сглаженного общего указателя и, следовательно, блокировка слабого указателя даст общий указатель с равным сохраненным и управляемым указатели. Но результаты меня смутили. Помнит ли слабый указатель, из какого указателя общего доступа? И есть ли способ получить управляемый объект сглаженного общего указателя?Неожиданное поведение интеллектуальных указателей
template<class T> struct Deleter {
void operator()(T* p) const {};
};
Deleter<T> d {};
T t1 {};
T* p1 = &t1;
T t2 {};
T* p2 = &t2;
auto sp1 = std::shared_ptr<T>(p1,d);
auto sp2 = std::shared_ptr<T>(sp1,p2);
auto wp = std::weak_ptr<T>(sp2);
std::cout << sp1.get() << " " << sp2.get() << " " << wp.lock().get() << std::endl;
продукции 0x7fff5798c958 0x7fff5798c948 0x7fff5798c948
В чем вопрос? Какой другой результат вы ожидали? – Barry
Я ожидал '0x7fff5798c958 0x7fff5798c948 0x7fff5798c958' –
Было бы очень плохо, если бы' shared_ptr' и 'weak_ptr' действовали так, как вы ожидали. Алиасирование 'shared_ptr' не будет столь же полезным. – StoryTeller