我有以下构造函数:
MutexWrapper::MutexWrapper(Mutex * pMutex)
{
DebugPrint("0x%x", pMutex); // displays 0x1f83e54
}
Run Code Online (Sandbox Code Playgroud)
并在以下函数中调用它:
void OnReviewBuffer_Callback( void * pUserData )
{
ReviewBuffer * thePointer = (ReviewBuffer *) pUserData;
DebugPrint("0x%x", thePointer); // this displays 0x1f83e48
MutexWrapper theMutexWrapper(thePointer);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我无法提供整个定义ReviewBuffer- 但我希望以下内容足够:
class ReviewBuffer : public StreamConsumer_Base, public Mutex
{
...
};
Run Code Online (Sandbox Code Playgroud)
问题是,当我打印出来时,thePointer我得到了0x1f83e48,但是从构造函数内部打印的值是0x1f83e54.
为什么指针值不同 - 这是否与传递指针副本的值传递有关?
您的类ReviewBuffer使用多重继承:
class ReviewBuffer : public StreamConsumer_Base, public Mutex
{
...
};
Run Code Online (Sandbox Code Playgroud)
类的内部布局(可能是*)如下所示:
Offset 0 class StreamConsumer_Base
... contents of that class (12 bytes including alignment: 0x1f83e54 - 0x1f83e48)
Offset 12 class Mutex
... contents of that class (unknown size)
Run Code Online (Sandbox Code Playgroud)
(*)可能因为标准中没有任何规定要求.这只是编译器实现它的通常方式.
最初打印时thePointer,它指向ReviewBuffer对象即.偏移0的类.但是当你将它传递给你的函数时,编译器会自动调整指针以指向Mutex部分ReviewBuffer.由于该Mutex部分位于偏移量12处,因此指针的值不能相同(想一想:如果它相同,则不会指向Mutexa ReviewBuffer或a或a StreamConsumer_Base).