Я просто знал std::enable_shared_from_this
форму this link.
Но, прочитав приведенный ниже код, я не знаю, когда его использовать.
Когда мы должны использовать std :: enable_shared_from_this
try {
Good not_so_good;
std::shared_ptr<Good> gp1 = not_so_good.getptr();
} catch(std::bad_weak_ptr& e) {
// undefined behavior (until C++17) and std::bad_weak_ptr thrown (since C++17)
std::cout << e.what() << '\n';
}
Код выше «не так хорошо», потому что нет никакого существующего shared_ptr
перед вызовом getptr()
. Так что хорошая вещь должна быть:
std::shared_ptr<Good> gp1 = std::make_shared<Good>(); // having a shared_ptr at the beginning
std::shared_ptr<Good> gp2 = gp1->getptr();
Однако, если я уже имел shared_ptr
объект, то почему бы мне не просто код как это: std::shared_ptr<Good> gp2 = gp1;
, а это означает, что мне не нужно std::enable_shared_from_this
вообще.
На мой взгляд, используя std::enable_shared_from_this
, чтобы убедиться, что более чем один shared_ptr
объекты имеют один и тот же блок управления, так что мы можем избежать the double-delete problem. Но если я должен напомнить себе создать shared_ptr
в начале. Почему бы мне просто не напомнить себе, что использовать объект shared_ptr
для создания нового, вместо использования необработанного указателя?
'void f (Хорошо & g);/* ... */f (* gp1);/* ... */void f (Good & g) {/ * теперь что? * /}' – milleniumbug
@milleniumbug sorry I не понимают, что вы пытаетесь сказать. – Yves
'f' не имеет доступа к' shared_ptr', так как он принимает ссылку, а не общий указатель. Иногда вы можете изменить, чтобы вместо этого была ссылка, но не для функций-членов - 'this' всегда является необработанным указателем. – milleniumbug