Как получить адрес объекта, выделенного новым оператором в C++?
Я новичок в C++, и я путаюсь с тем, как new
оператор работает.
Я выделил память в куче для объекта, как это:
string *myString = new string ("This is a string").
Если я хочу адрес этого объекта, я использую оператор адреса, например:
&myString
и получите шестнадцатеричный адрес первого символа myString: 0x28f3328
Если я использую имя объекта без оператора адреса:
myString
Я получаю другое шестнадцатеричное число взамен (0x7a5380
).
Какой второй номер? Это что-то значит или это просто какое-то случайное значение?
5 ответов
Это различие между адресом указателя и адресом того, на что указывает указатель.
std::string *myString = new std::string;
std::cout << &myString << std::endl; // prints the address of the myString pointer
std::cout << myString << std::endl; // prints the address of what myString points to
У вас есть указатель на объект, string *myString;
, Когда вы берете адрес, такой как &myString
Вы не получите адрес объекта! Вы получаете адрес указателя на него. поскольку myString
это указатель, это уже адрес вашего объекта.
Чтобы сделать это более понятным, рассмотрите следующее:
string *myString = new string("...");
string *anotherPointer = myString;
В этом коде оба myString
а также anotherPointer
указать на тот же объект; здесь точно один объект Однако если вы посмотрите на &myString
а также &anotherPointer
вы увидите, что эти указатели находятся в разных местах.
*myString = new string ("This is a string").
Вот myString
сам по себе является указателем, поэтому он хранит адрес некоторой памяти, то есть его значение является адресом. если ты &myString
Вы получите адрес myString
, потому что указатель также имеет некоторый адрес в памяти.
Я думаю, что вы имеете в виду стандартный класс std::string
Прямой ответ на ваш вопрос
Как получить адрес объекта, выделенного новым оператором в C++?
является то, что оператор new возвращает адрес объекта, выделенного в куче.:)
В этом заявлении
std::string *myString = new std::string ("This is a string");
вы определяете объект myString
это имеет значение, которое является адресом безымянного объекта типа std::string
выделено в кучу.
Итак, используя выражение *myString
Вы получаете доступ к безымянному объекту напрямую. например
std::cout << *myString << std::endl;
выражение &myString
это адрес самого объекта myString. Это не адрес неназванного объекта, выделенного в куче.
Сравните эти два утверждения
std::cout << *myString << std::endl;
std::cout << **&myString << std::endl;
Они дают одинаковый результат. Однако во втором утверждении вы должны применить два раза operator *
Используйте объекты с автоматической продолжительностью хранения всегда, когда это возможно:
std::string myString("Some string");
std::string* ptrToString = &myString; // initializing pointer with an address
Обратите внимание, что крайне маловероятно, что вам понадобится указатель на std::string
объект, чистый код, вероятно, будет обрабатывать его с помощью ссылки.
Но если вы действительно выделите его динамически, тогда эта строка:
std::string* ptrToString = new std::string("Some string");
создает объект (скорее всего, в куче) и назначает его адрес ptrToString
делая это указать на эту память. Но ptrToString
сама переменная с автоматической продолжительностью хранения, это память, в которой был сохранен адрес вашей строки. &ptrToString
дает адрес памяти, где хранится указатель.