В чем разница между необработанным указателем и слабым_птром?

Как в заголовке. На этот вопрос, возможно, уже есть ответ, но я не смог его найти.

21

Решение

Принципиальная концептуальная разница между голым указателем и 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
22

Другие решения

Необработанный указатель — это (по крайней мере, обычно) просто адрес. Вы не можете ничего рассказать о том, что это указывает в от самого указателя.

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 больше не существует, а не пытается получить доступ к уничтоженному объекту.

18

По вопросам рекламы [email protected]