указатели и сброс настроек - PullRequest
0 голосов
/ 29 ноября 2018

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

#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 ]

0 голосов
/ 29 ноября 2018

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

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

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

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

0 голосов
/ 29 ноября 2018

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

0 голосов
/ 29 ноября 2018

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

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

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

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

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

...