указатели и сброс настроек

Я играю с указателями в области наддува и не понимаю этого поведения:

#include <iostream>
#include <boost/scoped_ptr.hpp>

int main()
{

boost::scoped_ptr<int> p{new int{1}};
std::cout << &p << '\n';
p.reset(new int {2});
std::cout << &p << '\n';

return 0;
}

Я получаю следующий вывод:

0x7fff5fbff650
0x7fff5fbff650

Не должна ли функция сброса изменить адрес, указанный p?
это тот случай, если использовать массив с областью видимости вместо указателя с областью видимости и напечатать адрес, указанный первым элементом в приведенном выше коде.

4

Решение

Когда вы делаете

std::cout << &p << '\n';

вы получаете адрес p, не то, что p указывает на. Чтобы получить то, что вам нужно

std::cout << static_cast<void*>(p.get()) << '\n';

static_cast<void*>() на самом деле не требуется в этом примере, так как печать указателя, кроме char*/const char* даст вам свой адрес, но я добавил его, чтобы просто быть в безопасности.

7

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

Вы берете адрес scoped_ptr называется p, Там только один из них!

Если бы вы напечатали &*p или же p.get() вместо этого (хотя предпочитаю (void*)p.get() для здравомыслия) тогда вы будете печатать адрес вещь, на которую он в настоящее время указывает.

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

Если бы вы сделали .reset() сначала, однако, затем вы можете видеть или не видеть изменение этого адреса, в зависимости от того, какие внутренние new сделал; объекты не иметь иметь адреса, уникальные для времени жизни вашей программы, если они не разделяют адрес другого объекта, который все еще существует! Однако даже тогда, на практике, если честно, я бы удивился, если бы второй динамически распределялся int завелся по тому же адресу, что и первый.

5

Вы печатаете адрес объекта p с помощью boost :: scoped_ptr.
Вы должны использовать p.get (), чтобы получить адрес объекта handle;

0