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