Как создать std :: shared_ptr с тем же управляющим блоком, что и истекший std :: sleed_ptrC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как создать std :: shared_ptr с тем же управляющим блоком, что и истекший std :: sleed_ptr

Сообщение Anonymous »

tl; DR, как можно создать std :: shared_ptr из срок действия std :: sleed_ptr , чтобы он использовал тот же управляющий блок как std :: sleed_ptr ? />

Код: Выделить всё

#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()
Создает std :: shared_ptr , который имеет другой управляющий блок, чем истек , и который имеет одинаковый (no) управляющий блок, как и пустой std :: sleed_ptr /std :: shared_ptr .

Код: Выделить всё

null_empty
построен из nullptr имеет тот же (нет) управляющий блок, что и пустой построенный по умолчанию std :: shared_ptr /std :: sleed_ptr , в то время как null_nonempty , построенный из Static_cast (nullptr) имеет различный блок управления, по сравнению с пустым std: stact_ptrtrtr
[/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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»