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

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

#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? это тот случай, если использовать массив с областью видимости вместо указателя с областью видимости и напечатать адрес, указанный первым элементом в приведенном выше коде.

3 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам