#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
это адрес, по которому хранится сам указатель.