2

我有以下构造函数:

MutexWrapper::MutexWrapper(Mutex * pMutex)
{
  DebugPrint("0x%x", pMutex); // displays 0x1f83e54
}

它在以下函数中被调用:

void OnReviewBuffer_Callback( void * pUserData )
{
  ReviewBuffer * thePointer = (ReviewBuffer *) pUserData;

  DebugPrint("0x%x", thePointer); // this displays 0x1f83e48

  MutexWrapper theMutexWrapper(thePointer);
}

不幸的是,我无法提供 - 的完整定义,ReviewBuffer但我希望以下内容就足够了:

class ReviewBuffer  : public StreamConsumer_Base, public Mutex
{
  ...
};

问题是,当我打印出来时,thePointer我得到了0x1f83e48,但是从构造函数内部打印的值是0x1f83e54.

为什么指针值不同 - 这与传递指针副本的值传递有关吗?

4

3 回答 3

5

您的类ReviewBuffer使用多重继承:

class ReviewBuffer  : public StreamConsumer_Base, public Mutex
{
  ...
};

类的内部布局(可能*)如下所示:

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)

(*)可能是因为标准中没有任何规定。这只是编译器实现它的常用方式。

当您最初 printthePointer时,它指向ReviewBuffer对象,即。类的偏移量 0。但是当你将它传递给你的函数时,编译器会自动调整指针以指向Mutex. ReviewBuffer由于该Mutex部分位于偏移量 12 处,因此指针的值不能相同(想想看:如果它相同,它不会指向 aMutex而是指向 aReviewBuffer或 a StreamConsumer_Base)。

于 2013-05-20T15:35:13.853 回答
2

您的非默认构造函数MutexWrapper::MutexWrapperMutex*指针作为参数。您的函数OnReviewBuffer_Callback将提供void*的指针转换为ReviewBuffer*指针。可以将该ReviewBuffer*指针作为参数传递给的唯一方法MutexWrapper::MutexWrapper(Mutex*)是 ifReviewBufferMutex. 如果ReviewBuffer还继承自其他类,则将指针向下转换为ReviewBuffer*指针Mutex*可能会导致指针与原始地址不同。根据最新的编辑,这正是正在发生的事情。ReviewBuffer使用多重继承。

于 2013-05-20T15:35:11.210 回答
-1

在 C++ 中和在 Java 中一样,指针是按值传递的。引用传递是用词不当。

当然,指针指向同一个地址变量,看起来整体是通过引用传递的,但是……不是。

于 2013-05-20T15:14:06.217 回答