“this”指针会改变吗?

Does the "this" pointer change?

提问人:rwCapt 提问时间:7/12/2022 最后编辑:Remy LebeaurwCapt 更新时间:7/13/2022 访问量:125

问:

我正在使用 Win32 API 和一些包装本机 Win32 API 函数的 C++ 类,并管理窗口和应用程序本身。

因此,我还需要窗口过程()来获取和处理一些消息。WndProc()

为了处理这些消息,我使用 class-instance-pointer 访问类的一些成员函数:

Window* this_window = (Window*)GetWindowLongPtr(hWnd, GWLP_USERDATA);

但是在这里我有一个问题,这可能不是问题,但我不确定 C++ 标准如何定义这种情况。我正在使用该结构将指针保存在创建窗口的成员函数中。最后一个参数保存指针:CREATESTRUCTthisthis

CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, width, height, hWndParent, hMenu, hInstance, this);

对于此方法,指针不得更改。如果是这样,我会在函数中使用无效的指针。thisWndProc()

我可以相信指针不会改变吗?this

C++ 指针

评论

1赞 sweenish 7/12/2022
这个问题似乎有点误导。如果要存储指针,则除非代码实际更改它,否则它无法更改。否则,我认为没有足够的信息来解决您的问题。
4赞 tkausl 7/12/2022
对于任何给定的对象,永远不会改变。不同意味着不同的对象。thisthis
1赞 PaulMcKenzie 7/12/2022
this不能改变,它不可能.就连编译器也知道这一点,任何依赖于被更改或可以更改的代码,很多时候都会被编译器优化出来。为什么?因为它是永远不可能发生的废话代码。nullptrthisnullptr
1赞 πάντα ῥεῖ 7/12/2022
@rwCapt,那么您必须确保实例的生命周期始终超过可靠使用它的生命周期。Window* this_window
1赞 user253751 7/12/2022
@AdrianMaire 不适用于同一对象!这些只是允许您将一个对象复制到另一个对象中

答:

1赞 Remy Lebeau 7/13/2022 #1

指针不会改变,但您必须确保它指向正确的内容。

的参数是 ,因此它将按原样获取任何指针。但是,您特别需要一个指针,因此请确保您首先存储一个指针。lpParamCreateWindowEx()void*WndProc()Window*Window*

例如,如果您在派生自 的类中调用,则 will not .根据实际实现方式,不能保证指向同一 MyWindow 对象的指针和指针指向相同的内存地址。因此,您应该在将其传递给 之前从 到 上行,例如:CreateWindowEx()MyWindowWindowthisMyWindow*Window*MyWindowWindow*MyWindow*thisMyWindow*Window*SetWindowLongPtr(GWLP_USERDATA)

CreateWindowExW(..., static_cast<Window*>(this));

艺术

CreateWindowExW(..., this);
...
Window* this_window = static_cast<MyWindow*>(pcs->lpCreateParams);
SetWindowLongPtr(..., reinterpret_cast<LONG_PTR>(this_window));
...