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

时间:2014-06-21 10:31:58

标签: pointers heap-memory stack-memory

我正在学习C ++,我有一个问题,关于我正在使用的材料。我认为编辑可能会有一些错误,但我不太确定。我的书的名字是“C ++通过游戏编程”。

这是本书中的代码,见第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中的堆上的字符串的地址”是&amp; mName,因为它们在方法中打印出来。

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

为了说清楚,我也尝试打印&amp; mAge。

我得到的是:

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

正如您所看到的,&amp; mName和&amp; mAge具有几乎相似的地址,但mName是不同的。所以mName可能指向堆,而&amp; mName和&amp; mAge实际上是属于堆栈的地址。

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

感谢您的帮助。我真的很感激。

1 个答案:

答案 0 :(得分:0)

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

相关问题