如何获取this指针的地址

首先this指针并不在类结构中,而是通过参数隐式传递给成员函数,那么在成员函数中打出this指针的地址会怎么样。

class MC{
public:
      long address() { 
        return long(&this); 
    }
};

上面的代码会编译报错,提示信息大概是这个样子:

单目‘&’的操作数必须是左值
return &this;

然后,我用gdb看了下this的类型,是这样的:

(gdb) whatis this
type = MC * const

想请问下,为什么上面打印出this指针的地址会提示错误,MC * const也不能说一定是右值吧,而且this指针本来就是成员函数的一个形参,为什么就不允许取他的地址?求助。

阅读 13.9k
3 个回答

this 本来就是个指针,所以直接 (long) this 就好了。

下面的代码可以验证这一点:

#include <iostream>

using namespace std;

class MC{
public:
      long address() {
        return long(this);
    }
};

int main () {
    MC m;
    cout << m.address() << endl;
    cout << ((MC*)m.address())->address() << endl;
    return 0;
}

this 不是一个变量,故没有地址,参见:https://stackoverflow.com/que...

问题就是this是一个右值,右值不能&所以语法错误。你要是想拿this的地址就定义一个常引用去绑定this;
class MC {
public:

long address() {
    MC * const & c = this;
    return long(&c);
}

};

@hsfzxjy

It is not a variable that is stored somewhere (or could even be changed)

我这里有个疑惑。this指针是隐式传入成员函数的,那么this作为一个传入的形参,形参内存地址不是可以拿到的吗。gdb打印的栈信息如下:

class MC {
public:
    long address(int tmp) {
        //return long(&this);
        return 0;
    }
};


(gdb) bt
#0  MC::address (this=0x7fffffffe40f, tmp=0) at this2.cc:5
#1  0x00000000004005c9 in main () at this2.cc:12
(gdb) whatis this
type = MC * const

可以看到MC::address的第一个参数就是this,其值为0x7fffffffe40f,也就是this指针放的内容。这个形参叫this,想取他的地址不就是&this吗?

另外,倒是可以在gdb中把this指针的地址打出来:

(gdb) print &tmp
$4 = (int *) 0x7fffffffe3e4
(gdb) print &this
$5 = (MC * const *) 0x7fffffffe3e8
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏