Код: Выделить всё
#include
#include
#define TEST(a, b) printf("%14s has %9s control block as %s\n", #a, \
a.owner_before(b) || b.owner_before(a) ? "different" : "same", #b)
int main() {
std::weak_ptr empty { };
std::weak_ptr expired { std::make_shared() };
std::shared_ptr locked_expired{ expired.lock() };
std::shared_ptr null_nonempty { static_cast(nullptr) };
std::shared_ptr null_empty { nullptr };
TEST(locked_expired, expired);
TEST(locked_expired, empty );
TEST(null_nonempty, empty );
TEST(null_empty, empty );
}
< /code>
Выходы: < /p>
locked_expired has different control block as expired
locked_expired has same control block as empty
null_nonempty has different control block as empty
null_empty has same control block as empty
< /code>
Есть две странности: < /p>
[list]
[*] expired.lock()Код: Выделить всё
null_empty[/list]
Это отличается от того, что я бы ожидал:
- Я бы ожидал, что он должен создать std :: shared_ptr с помощью Control Block, как и истек , но, конечно, с null inpter, закрепленным в нем.), так как это было срок действия .
Код: Выделить всё
.get() == nullptr - Я бы ожидал, что std :: shared_ptr из nullptr , чтобы вести себя так же, как std :: shared_ptr Code> Code> (null_tulptr> (null_tulptr> (null_tulptr> (null_tulptr> (null_tuleptr> (null_tule std :: shared_ptr с новым управляющим блоком, отличным от построенного по умолчанию std :: shared_ptr без блока управления.
я не обеспокоен № 2, так как он легко работает. Но #1 кажется неразрешимым.
Как можно создать с истечения срока действия std :: shared_ptr , чтобы он использовал тот же управляющий блок как std :: sleed_ptr , ie oppired.lock () => => => std:> std:> std:> std:> std:> std:> std:> std:> std:> std:> std:> std:> std:> std> std: Использование того же управляющего блока и собственности как истечь , но с нулевым указателем, хранящимся в нем?>
Подробнее здесь: https://stackoverflow.com/questions/797 ... pired-stdw
Мобильная версия