首页 文章

存储在堆内存中的成员数据的地址

提问于
浏览
2

我正在学习C,我有一个问题,关于我正在使用的材料 . 我认为编辑可能会有一些错误,但我不太确定 . 我的书的名字是“C through game programming” .

这是本书中的代码,见第9章 .

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

private:
    string *mName;
    int mAge;
};

Critter::Critter(const string &name, int age) {
    cout << "Constructor called\n";
    mName = new string(name);
    mAge = age;
}

Critter::~Critter() {
    cout << "Destructor called\n";
    delete mName;
}

Critter::Critter(const Critter &c) {
    cout << "Copy constructor called\n";
    mName = new string(*(c.mName));
    mAge = c.mAge;
}


Critter& Critter::operator=(const Critter& c) {
    cout << "Overloading assignment operator called\n";
    if (this != &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 << "&mName: " << &mName << endl;
}

在这里,我正在创建一个Critter类,并测试分配堆内存 . 如您所见,我声明了指向堆内存上的字符串对象的指针* mName .

所以令我困惑的是,在最后一个方法中:void Critter :: greet()const他们说“存储在指针m_pName中的堆上的字符串的地址”是&mName,因为它们在方法 .

但我认为mName本身就是存储在堆上的字符串对象的地址 . 所以&mName是指针本身的地址 .

为了说清楚,我也尝试打印&mAge .

而我得到的是:

&mName: 0x7fff5fbff640
mName: 0x100103b20
&mAge: 0x7fff5fbff648

如您所见,&mName和&mAge具有几乎相似的地址,但mName是不同的 . 因此,mName可能指向堆,而&mName和&mAge实际上是属于堆栈的地址 .

这就是我的想法,我试图找到那本书的勘误,但我一无所获 . 你们能帮我说清楚吗?我是对的还是我可能有一些误解 .

谢谢你的帮助 . 对此,我真的非常感激 .

1 回答

  • 0

    你做对了 . 因为 mName 是一个指针,所以该指针的值是它指向的字符串对象的地址 . &mName 是指针本身的存储地址 .

相关问题