Как получить адрес объекта, выделенного новым оператором в 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 дает адрес памяти, где хранится указатель.

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