Как в заголовке. На этот вопрос, возможно, уже есть ответ, но я не смог его найти.
Принципиальная концептуальная разница между голым указателем и weak_ptr
является то, что, если объект, на который указывает, уничтожен, голый указатель не будет рассказать вам об этом. Это называется висячий указатель: указатель на объект, который не существует. Их вообще сложно отследить.
weak_ptr
будут. Для того, чтобы использовать weak_ptr
, вы должны сначала преобразовать его в shared_ptr
, И если это shared_ptr
ни на что не указывает, значит объект был удален.
Например:
#include <iostream>
#include <memory>
std::weak_ptr<int> wp;
void test()
{
auto spt = wp.lock(); // Has to be copied into a shared_ptr before usage
if (spt) {
std::cout << *spt << "\n";
} else {
std::cout << "wp is expired\n";
}
}
int main()
{
{
auto sp = std::make_shared<int>(42);
wp = sp;
test();
}
test();
}
Выход
42
wp is expired
Необработанный указатель — это (по крайней мере, обычно) просто адрес. Вы не можете ничего рассказать о том, что это указывает в от самого указателя.
weak_ptr
всегда ассоциируется с shared_ptr
так что, вероятно, нам нужно начать с shared_ptr
иметь какой-либо смысл weak_ptr
,
shared_ptr
является подсчетом ссылок, поэтому он отслеживает, сколько ссылок (указателей) на объект существует, и автоматически уничтожает объект, когда больше нет ссылок на этот объект.
Как я уже сказал, weak_ptr
связано с shared_ptr
, В отличие от shared_ptr
существование weak_ptr
делает не увеличить счетчик ссылок для объекта pointee. Использовать weak_ptr
, вы должны сначала преобразовать его в shared_ptr
, Если текущее число ссылок положительно, это будет успешно, а также преобразование weak_ptr
к shared_ptr
увеличит счетчик ссылок, чтобы показать, что преобразованный указатель является «реальной» ссылкой на объект. Если, с другой стороны, счетчик ссылок уже равен нулю (имеется в виду, что объект pointee уже уничтожен), попытка преобразовать weak_ptr
к shared_ptr
просто потерпит неудачу.
shared_ptr
означает совместное владение объектом pointee. Объект pointee будет существовать до тех пор, пока существует хотя бы один shared_ptr для этого объекта, но как только последний shared_ptr
объект уничтожен, так же как и объект-объект.
weak_ptr
означает не принадлежащий доступ к объекту pointee. Это разрешает доступ, если объект существует. Если объект был уничтожен, он говорит вам, что объект pointee больше не существует, а не пытается получить доступ к уничтоженному объекту.