将"this"分配给"MyClass *instance","instance->member"引用的内存与"this->member"不同
assign `this` to `MyClass *instance`, `instance->member` is not referencing same memory as `this->member`
在我的cpp实现中,我有:
static MyClass *instance;
在所有包含作用域(大括号{})之外自由浮动。我也试过将它初始化为nullptr。
void MyClass::myMethod() {
instance = this;
LOG("Hello, %d, %d", wList, instance->wList);
上面的日志显示了成员对象指针wList
的任意位置,但instance
应该指向与this
相同的数据,因此指向相同的wList
,但它没有。instance->wList
仍然是0。这里发生了什么?
正如Mark Ransom在评论中指出的那样,您不能使用%d
格式说明符来打印指针,为了使您的代码可移植,您必须使用%p
。从技术上讲,使用%p
以外的任何指针都是未定义的行为,但很可能你会看到它似乎在32位系统上工作得很好。
然而,在64位系统上,我打赌你正在使用,它会爆炸。指针是8个字节,但是printf
在看到%d
时只尝试从堆栈中读取4个字节。对于第二个%d
说明符,它读取接下来的4个字节,这是指针的另外4个字节-如果您看到0,这可能意味着您的指针在小端系统上的前4 GB内存中分配(即其值类似于0x00000000'xxxxxxxx
)。从传递给printf
的第二个指针的堆栈上的8个字节永远不会被读取。
%p
指示符可移植地在所有平台上打印指针,无论它们是32位,64位还是其他大小。这样做的一个不幸的后果是,确切的输出格式是实现定义的,这意味着它可以并且确实在系统之间改变。有些系统可能使用前导0x
或0X
,而其他系统可能根本没有前缀,只是打印原始十六进制值。
如果你想控制精确的输出,那么你可以使用你选择的格式(例如%08x
或%016llx
),只要你为该说明符适当地转换指针。例如,以下是在32位和64位系统上的操作方法:
printf("0x%08xn", (unsigned int)(uintptr_t)myPointer); // 32-bit
printf("0x%016llxn", (unsigned long long)(uintptr_t)myPointer); // 64-bit
进行两次强制转换的原因是为了避免错误的编译器警告,因为如果从指针类型强制转换为不能保证大到足以容纳指针的整数类型,一些编译器会报错。
- EASTL矢量<向量<int>>连续的
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- Centos7 g++ "to_string is not in a member of std"
- C++复制函数重载导致"must be a nonstatic member function"错误
- C++ "Invalid use of 'this' in non-member function" ,
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 使用 GraphicsPath::AddString() 抱怨"class 'GraphicsPath' has no member 'AddString'"
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 当我编译XG-Bosst时,出现错误"error: 'Split' is not a member of 'xgboost::common' ……"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- 使用线程从另一个成员函数调用一个Member函数
- 为什么"non-standard syntax; use '&' to create a pointer to member"在 CTOR 中使用线程?
- 尝试打印字符串时"Python Exception <class 'gdb.error'> There is no member named _M_dataplus."
- 为什么我会收到此警告? "Member 'x' was not initialized in this constructor"
- std::p riority_queue<struct with const member&> - 'operator =' 函数不可用
- Protobuf 生成的C++类无法针对 iOS 进行编译,并显示错误"Only virtual member functions can be marked 'final'"
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 将数据添加到 CArray 会产生错误"cannot access private member declared in class 'CObject'"