Адрес данных элемента, хранящихся в памяти кучи

#pointers #heap-memory #stack-memory

#указатели #куча-память #стек-память

Вопрос:

Я изучаю C , и у меня возник вопрос о материале, который я использую. Я думаю, что при редактировании могут быть некоторые ошибки, но я совершенно не уверен. Название моей книги «C через программирование игр».

Вот код в книге, он находится в главе 9.

 class Critter {
public:
    Critter(const string amp;name = "", int age = 0);
    ~Critter();
    Critter(const Critter amp;c);
    Critteramp; operator=(const Critteramp; c);
    void greet() const;

private:
    string *mName;
    int mAge;
};

Critter::Critter(const string amp;name, int age) {
    cout << "Constructor calledn";
    mName = new string(name);
    mAge = age;
}

Critter::~Critter() {
    cout << "Destructor calledn";
    delete mName;
}

Critter::Critter(const Critter amp;c) {
    cout << "Copy constructor calledn";
    mName = new string(*(c.mName));
    mAge = c.mAge;
}


Critteramp; Critter::operator=(const Critteramp; c) {
    cout << "Overloading assignment operator calledn";
    if (this != amp;c) {
        delete mName;
        mName = new string(*(c.mName));
        mAge = c.mAge;
    }
    return *this;
}

void Critter::greet() const {
    cout << "I'm " << *mName << " and I'm " << mAge << " years old.n";
    cout << "amp;mName: " << amp;mName << endl;
}
  

Здесь я создаю класс Critter и тестирую выделение памяти кучи. Как вы можете видеть, я объявил указатель *mName, который указывает на строковый объект в памяти кучи.

Итак, что меня сейчас смущает, так это то, что в последнем методе: void Critter::greet() const Они говорят, что «адрес строки в куче, хранящейся в указателе m_pName», равен amp;mName , поскольку они распечатывают его в методе.

Но я думаю, что само mName является адресом строкового объекта, хранящегося в куче. Таким образом, amp;mName — это адрес самого указателя.

Чтобы было понятно, я также пытаюсь распечатать amp;mAge .

И что я получил:

 amp;mName: 0x7fff5fbff640
mName: 0x100103b20
amp;mAge: 0x7fff5fbff648
  

Как вы можете видеть, amp;mName и amp;mAge имеют почти одинаковый адрес, но mName отличается. Так что, возможно, mName указывает на кучу, а amp;mName и amp;mAge на самом деле являются адресами, которые принадлежат стеку.

Вот что я думаю, я пытался найти ошибки в этой книге, но ничего не нашел. Можете ли вы, ребята, прояснить это для меня. Я был прав или у меня могло быть какое-то недопонимание.

Спасибо за вашу помощь. Я действительно ценю это.

Ответ №1:

У вас все правильно. Поскольку mName это указатель, значение этого указателя является адресом строкового объекта, на который он указывает. amp;mName это адрес, по которому хранится сам указатель.